java反射快速掌握

反射的定義:

JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

Java的反射機制是在編譯並不確定是哪個類被載入了,而是在程式執行的時候才載入、探知、自審。使用在編譯期並不知道的類。這樣的特點就是反射。

反射就是把java類中的各種成分對映成一個個的Java物件

三種獲取class物件的方法:

呼叫例項化物件的getClass方法

直接呼叫類名。class

直接呼叫Clas類的靜態方法forname(包名。類名)

程式碼:

package reflex;public class User { public User(){ System。out。println(“無參構造”); } public User(String name){ System。out。println(“一個引數:”+name); } public User(String name,int age){ System。out。println(“兩個引數:”+name+“ ”+age); } private User(int age){ System。out。println(“私有構造方法:”+age); }}————package reflex;public class Reflex { public static void main(String[] args){ //第一種方式獲取Class物件 User user1 = new User(); Class userClass1=user1。getClass(); System。out。println(userClass1。getName()); //第二種方法獲取Class物件 Class userClass2=User。class; System。out。println(userClass2。getName()); System。out。println(userClass1==userClass2); //第三種方法獲取Class物件 try{ Class userClass3=Class。forName(“reflex。User”); System。out。println(userClass3。getName()); System。out。println(userClass2==userClass3); }catch (ClassNotFoundException e){ e。printStackTrace(); } /* 結果: 無參構造 reflex。User reflex。User true class reflex。User true //比較結果說明只有一個Class類 */ }}

透過反射獲取構造方法、成員變數、普通方法:

構造方法:

package reflex;public class User { public User(){ System。out。println(“無參構造”); } public User(String name){ System。out。println(“一個引數:”+name); } public User(String name,int age){ System。out。println(“兩個引數:”+name+“ ”+age); } private User(int age){ System。out。println(“私有構造方法:”+age); }}————package reflex;import java。lang。reflect。Constructor;public class ConstructorTest{ public static void main(String[] args) throws Exception{ //1。載入Class物件 Class class1=Class。forName(“reflex。User”); //2。獲取所有構造方法 System。out。println(“————-所有公有構造方法——————”); Constructor[] conArray=class1。getConstructors(); for(Constructor c:conArray){ System。out。println(c); } System。out。println(“————-所有構造方法——————”); conArray=class1。getDeclaredConstructors(); for(Constructor c:conArray){ System。out。println(c); } System。out。println(“————-公有無參構造犯法——————”); Constructor con=class1。getConstructor(null); System。out。println(“con=”+con); //呼叫構造方法 Object obj=con。newInstance(); System。out。println(“——————私有構造方法————-”); con=class1。getDeclaredConstructor(int。class); System。out。println(“con=”+con); //呼叫構造方法 con。setAccessible(true); obj=con。newInstance(20); }}

成員變數

package reflex;public class User { public String name; protected int age; char sex; private String phoneNum; @Override public String toString(){ return “User [name=” + name + “, age=” + age + “, sex=” + sex + “,phoneNum=” + phoneNum + “]”; }}————package reflex;import java。lang。reflect。Field;public class FieldTest { public static void main(String[] args) throws Exception{ //1。獲取Class物件 Class class2=Class。forName(“reflex。User”); //2。獲取欄位 System。out。println(“————-所有公有欄位————-”); Field[] fieldArray=class2。getFields(); for(Field f:fieldArray){ System。out。println(f); } System。out。println(“————-所有欄位————-”); fieldArray=class2。getDeclaredFields(); for(Field f:fieldArray){ System。out。println(f); } System。out。println(“————-獲取公有欄位並呼叫——————”); Field f=class2。getField(“name”); System。out。println(f); //獲取物件 Object obj=class2。getConstructor()。newInstance(); //為欄位設定值 f。set(obj,“Keane”); //強制型別轉換 User user=(User)obj; System。out。println(“驗證:”+user。name); System。out。println(“————-獲取私有欄位並呼叫——————”); f=class2。getDeclaredField(“phoneNum”); System。out。println(f); f。setAccessible(true); //為欄位設定值 f。set(obj,“18888888888”); //強制型別轉換 System。out。println(“驗證:”+user); }}

普通方法(或者main方法)

package reflex;public class User { public void method1(String s){ System。out。println(“呼叫了:公有的,String引數的show1(): s = ” + s); } protected void method2(){ System。out。println(“呼叫了:受保護的,無參的show2()”); } void method3(){ System。out。println(“呼叫了:預設的,無參的show3()”); } private String method4(int age){ System。out。println(“呼叫了,私有的,並且有返回值的,int引數的show4(): age = ” + age); return “abcd”; } }}————package reflex;import java。lang。reflect。Method;public class MethodTest { public static void main(String[] args) throws Exception { //1。獲取Class物件 Class class3 = Class。forName(“reflex。User”); //2。獲取公有方法 System。out。println(“——————所有公有方法——————”); Method[] methodArray = class3。getMethods(); for (Method m : methodArray) { System。out。println(m); } System。out。println(“——————所有的方法——————”); methodArray = class3。getDeclaredMethods(); for (Method m : methodArray) { System。out。println(m); } System。out。println(“——————公有的method1()方法——————”); Method m = class3。getMethod(“method1”, String。class); System。out。println(m); //例項化一個User物件 Object obj = class3。getConstructor()。newInstance(); m。invoke(obj, “Keane”); System。out。println(“***************私有的method4()方法******************”); m = class3。getDeclaredMethod(“method4”, int。class); System。out。println(m); m。setAccessible(true);//解除私有限定 Object result = m。invoke(obj, 20);//需要兩個引數,一個是要呼叫的物件(獲取有反射),一個是實參 System。out。println(“返回值:” + result); }}