一、反射
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了蓋州免費(fèi)建站歡迎大家使用!
反射:JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。
要想解剖一個(gè)類,必須先要獲取到該類的字節(jié)碼文件對(duì)象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對(duì)應(yīng)的Class類型的對(duì)象。對(duì)于反射的操作實(shí)際上就是通過(guò)Class對(duì)象獲?。?/p>
*a、java.lang.reflect.Field:提供有關(guān)類或接口的單個(gè)字段的信息,以及對(duì)它的動(dòng)態(tài)訪問權(quán)限。反射的字段可能是一個(gè)類(靜態(tài))字段或?qū)嵗侄?。操作類的成員變量。
*b、java.lang.reflect.Constructor
*c、java.lang.reflect.Method:操作類的方法。
在學(xué)習(xí)反射基礎(chǔ)前先創(chuàng)建一個(gè)Person對(duì)象作為實(shí)例
package com.jalja.org.base.relfect; public class Person { private String name; int age; public String address; public Person() { } private Person(String name) { this.name = name; } Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method " + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }
二、獲取類的Class對(duì)象
public static void getClassObject() throws ClassNotFoundException{ //方式一:Object的getClass()方法 Person person1=new Person(); Person person2=new Person(); Class c1=person1.getClass(); Class c2=person2.getClass(); System.out.println(person1==person2);//false System.out.println(c1==c2);//true 不管JVM內(nèi)存中有多少個(gè)對(duì)象,對(duì)于字節(jié)碼文件來(lái)說(shuō)只有一份 //方式二:數(shù)據(jù)類型的靜態(tài)class屬性 Class c3=Person.class; System.out.println(c1==c3);//true //方式三:Class 類的靜態(tài)方法 //public static Class<?> forName(String className)throws ClassNotFoundException Class c4=Class.forName("com.jalja.org.base.relfect.Person"); System.out.println(c1==c4);//true }
三、java.lang.reflect.Constructor
1、獲取Constructor對(duì)象
//獲取Class 對(duì)象所表示的類的構(gòu)造方法 public static void getConstructorTest() throws Exception{ Class c4=Class.forName("com.jalja.org.base.relfect.Person"); //1、獲取Class 對(duì)象所表示的類所有公共構(gòu)造方法 //public Constructor<?>[] getConstructors() throws SecurityException Constructor [] cs=c4.getConstructors(); //2、獲取Class 對(duì)象所表示的類所有構(gòu)造方法 //public Constructor<?>[] getDeclaredConstructors() throws SecurityException Constructor[] cs2 =c4.getDeclaredConstructors(); //3、獲取Class對(duì)象所表示類的指定指定公共構(gòu)造方法, parameterTypes 參數(shù)是 Class 對(duì)象的一個(gè)數(shù)組 ,是指定數(shù)據(jù)類型的字節(jié)碼 //public ConstructorgetConstructor(Class<?>... parameterTypes); Constructor cs3=c4.getConstructor();//獲取公共的無(wú)參構(gòu)造方法的Constructor對(duì)象 //獲取 該 構(gòu)造函數(shù) public Person(String name, int age, String address) Constructor cs4=c4.getConstructor(String.class,int.class,String.class); //4、獲取Clss對(duì)象所表示類指定的構(gòu)造范法官 parameterTypes 參數(shù)是 Class 對(duì)象的一個(gè)數(shù)組,它按聲明順序標(biāo)識(shí)構(gòu)造方法的形參類型的字節(jié)碼。 //public Constructor getDeclaredConstructor(Class<?>... parameterTypes); //獲取該構(gòu)造 函數(shù) private Person(String name) 的Constructor對(duì)象 Constructor cs5=c4.getDeclaredConstructor(String.class); }
2、通過(guò) Constructor 對(duì)象創(chuàng)建Class對(duì)象所表示類的實(shí)例
public static void createObject() throws Exception{ Class c4=Class.forName("com.jalja.org.base.relfect.Person"); //使用此 Constructor 對(duì)象表示的構(gòu)造方法來(lái)創(chuàng)建該構(gòu)造方法的聲明類的新實(shí)例,并用指定的初始化參數(shù)初始化該實(shí)例 //public T newInstance(Object... initargs); // Person person=new Person() Constructor cs3=c4.getConstructor();//獲取公共的無(wú)參構(gòu)造方法的Constructor對(duì)象 Object obj=cs3.newInstance(); //Person person=new Person("jalja", 21, "北京"); Constructor cs4=c4.getConstructor(String.class,int.class,String.class); Object obj1=cs4.newInstance("jalja",21,"北京"); System.out.println(obj1);//Person [name=jalja, age=21, address=北京] //實(shí)例化一個(gè)私有的構(gòu)造函數(shù) private Person(String name) //控制java的訪問檢查 //public void setAccessible(boolean flag) //將此對(duì)象的 accessible 標(biāo)志設(shè)置為指示的布爾值。值為 true 則指示反射的對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪問檢查。 //值為 false 則指示反射的對(duì)象應(yīng)該實(shí)施 Java 語(yǔ)言訪問檢查。 Constructor cs5=c4.getDeclaredConstructor(String.class); cs5.setAccessible(true); Object obj2=cs5.newInstance("張三豐"); System.out.println(obj2);//Person [name=張三豐, age=0, address=null] }
四、java.lang.reflect.Field
1、獲取Field對(duì)象
//獲取Class類的Field對(duì)象 public static void getFieldTest() throws Exception{ Class cs=Class.forName("com.jalja.org.base.relfect.Person"); //1、public Field[] getFields() throws SecurityException //獲取Class 對(duì)象所表示的類或接口的所有可訪問公共(public修飾的)字段 Field [] fs=cs.getFields(); //2、public Field[] getDeclaredFields() throws SecurityException // 獲取Class 對(duì)象所表示的類或接口所聲明的所有字段。包括公共、保護(hù)、默認(rèn)(包)訪問和私有字段,但不包括繼承的字段 Field [] fs1=cs.getDeclaredFields(); //3、public Field getField(String name)throws NoSuchFieldException, SecurityException; //獲取Class 對(duì)象所表示的類或接口的指定公共成員(public修飾)字段。name 參數(shù)是一個(gè) String,用于指定所需字段的簡(jiǎn)稱 Field fs2=cs.getField("address"); //public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException //獲取 Class 對(duì)象所表示的類或接口的指定已聲明字段。name 參數(shù)是一個(gè) String,它指定所需字段的簡(jiǎn)稱 Field fs3=cs.getDeclaredField("name"); System.out.println(fs3); }
2、通過(guò)Field對(duì)象對(duì)指定類屬性賦值
//使用 Field對(duì)象 public static void createVarValue() throws Exception{ Class cs=Class.forName("com.jalja.org.base.relfect.Person"); Object obj=cs.getConstructor().newInstance(); Field addressField=cs.getField("address"); //public void set(Object obj, Object value); //將指定對(duì)象變量上此 Field 對(duì)象表示的字段設(shè)置為指定的新值。如果底層字段的類型為基本類型,則對(duì)新值進(jìn)行自動(dòng)解包 //obj - 應(yīng)該修改其字段的對(duì)象 value - 正被修改的 obj 的字段的新值 addressField.set(obj, "北京"); System.out.println(obj); //Person [name=null, age=0, address=北京] //對(duì)非public修飾的變量操作 Field nameField=cs.getDeclaredField("name"); //控制java的訪問檢查 nameField.setAccessible(true); nameField.set(obj, "張三豐"); System.out.println(obj);//Person [name=張三豐, age=0, address=北京] }
五、java.lang.reflect.Method
1、獲取Method對(duì)象
//獲取Method對(duì)象 public static void getMethodTest() throws Exception{ Class cs=Class.forName("com.jalja.org.base.relfect.Person"); //1、public Method[] getMethods() throws SecurityException //獲取Class 對(duì)象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 Method [] m1=cs.getMethods(); //2、public Method[] getDeclaredMethods() throws SecurityException //獲取Class 對(duì)象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法 Method [] m2=cs.getDeclaredMethods(); //3、public Method getMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException; // 獲取Class 對(duì)象所表示的類或接口的指定公共成員方法。name 參數(shù)是一個(gè) String,用于指定所需方法的簡(jiǎn)稱。parameterTypes 參數(shù)是按聲明順序標(biāo)識(shí)該方法形參類型的 Class 對(duì)象的一個(gè)數(shù)組 Method m3=cs.getMethod("show");//無(wú)參的方法 Method m4=cs.getMethod("method",String.class);//帶參的方法 //public Method getDeclaredMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException // Class 對(duì)象所表示的類或接口的指定已聲明方法。name 參數(shù)是一個(gè) String,它指定所需方法的簡(jiǎn)稱,parameterTypes 參數(shù)是 Class 對(duì)象的一個(gè)數(shù)組 Method m5=cs.getDeclaredMethod("function");//無(wú)參的方法 System.out.println(m5); }
2、通過(guò)Method對(duì)象調(diào)用指定類的方法
// Method對(duì)象的使用 public static void createMethod() throws Exception{ Class cs=Class.forName("com.jalja.org.base.relfect.Person"); Object obj=cs.getConstructor().newInstance(); Method m3=cs.getMethod("show");//無(wú)參的方法 //public Object invoke(Object obj,Object... args) //對(duì)帶有指定參數(shù)的指定對(duì)象調(diào)用由此 Method 對(duì)象表示的底層方法 obj - 從中調(diào)用底層方法的對(duì)象 args - 用于方法調(diào)用的參數(shù) m3.invoke(obj); //對(duì)帶參方法的操作 Method m4=cs.getMethod("method",String.class);//帶參的方法 m4.invoke(obj,"北京"); //對(duì)有返回值得方法操作 Method m6=cs.getMethod("getString",String.class,int.class);//帶參的方法 Object str=m6.invoke(obj,"北京",200); System.out.println(str); //對(duì)私有無(wú)參方法的操作 Method m5=cs.getDeclaredMethod("function"); m5.setAccessible(true); m5.invoke(obj); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。