jAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。
眾所周知哈 java ,c++,c#這類語言不屬於動態語言;而目前的結論是 在程序運行狀態中能允許改變變量類型和程序結構的被稱之為動態語言;但是java Reflection 具備看透class 的能力這種能力被稱為introspection (內省,內觀) (面試重點 需要的同學可以自行百度詳細了解一下 我能力有限講不明白)(只有java 提供反射機制 像c++,c#等 非動態語言沒有提供)
java 反射機制提供的功能 (注意:大前提是在運行狀態下):
- 判斷任意一個對象所屬類
- 構造任意一個類的對象
- 判斷任意一個類所具有的成員變量和方法
- 調用任意一個對象的方法
java 反射機制的主要類 主要位於 java.lang.reflet
-
Class類 代表一個類
- Filed類 代表類的成員變量
- Method 代表類的方法
- Constructor 代表類的構造方法
- Array 提供動態創建數組以及訪問數組中元素的靜態方法
Java 通過反射獲取某個類里所有的方法 直接上代碼 :
java獲取class 類的三種方法:
- class.froname("類的路徑")
- 類名.class
- 實例.getclass
/* 實例 操作 */ public static void main(String[] args ) throws ClassNotFoundException { /*獲得字符串服表示的類的 class 對象*/ Class<?> aClass= Class.forName("java.lang.String"); /* 可以獲取里面 的所有方法 */ Method[] methods = aClass.getDeclaredMethods(); for(Method method : methods){ System.out.println(method); }
結果 :
java 反射動態的調用某個類的特定的方法 首先要獲取該類的Method 方法 對於類的成員變量和構造方法類似 首先要獲取 Filed 和 Constroutor
/*普通方法 */ public int add (int a,int b) { return a+b; } public static void main(String[] args ) throws Exception { /* 通過 .class 方法 獲取 該類中的所有對象 */ Class<?> aClass = Reflections.class; /* 生成該類的實例化對象 創建一個新的實例 */ Object reflection = aClass.newInstance(); /* 判斷 reflectiong 是否是 Reflections 的實例 返回結果為true */ System.out.println( reflection instanceof Reflections ); /* 通過這個類的 getmethod 方法獲取到 該類的 add 方法 */ Method add = aClass.getMethod("add",new Class[]{int.class,int.class}); /*反射方式 操作獲取到的方法 */ Object result = add.invoke(reflection,new Object[]{1,2}); System.out.println((Integer)result); //結果為3 }
/* 完成對 gflection 的拷貝工作 */ public Object copy (Object object) throws Exception { Class<?> aClass = object.getClass(); System.out.println(aClass); /* 獲取構造方法 */ Constructor con = aClass.getConstructor(new Class[]{String.class,int.class}); Object gbj = con.newInstance(new Object[]{"楊一",1}); System.out.println(gbj); /*獲得獨享的所有成員變量*/ Field[] fields = aClass.getDeclaredFields(); for (Field field :fields){ String name = field.getName(); System.out.println(name); } return null; } public static void main(String[] args) throws Exception{ Reflections reflections = new Reflections(); reflections.copy(new gflection()); } } /* 類 */ class gflection { private int age; private String name; /* 第一個構造方法 */ public gflection(){ } /* 帶參數的構造方法 */ public gflection(String name,int age){ this.age = age; this.name = name; } /*get set 方法*/ public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; }
附上測試代碼:
import javafx.scene.effect.Reflection; import javax.xml.ws.spi.Invoker; import java.io.File; import java.lang.reflect.*; /** * Created by 楊一 on 2017/5/4. */ public class Reflections { /* *//* 實例 操作 *//* public static void main(String[] args ) throws ClassNotFoundException { *//*獲得字符串服表示的類的 class 對象*//* Class<?> aClass= Class.forName("java.lang.String"); *//* 可以獲取里面 的所有方法 *//* Method[] methods = aClass.getDeclaredMethods(); for(Method method : methods){ System.out.println(method); } }*/ /* *//*普通方法 *//* public int add (int a,int b) { return a+b; }*/ /* public static void main(String[] args ) throws Exception { *//* 通過 .class 方法 獲取 該類中的所有對象 *//* Class<?> aClass = Reflections.class; *//* 生成該類的實例化對象 創建一個新的實例 *//* Object reflection = aClass.newInstance(); *//* 判斷 reflectiong 是否是 Reflections 的實例 返回結果為true *//* System.out.println( reflection instanceof Reflections ); *//* 通過這個類的 getmethod 方法獲取到 該類的 add 方法 *//* Method add = aClass.getMethod("add",new Class[]{int.class,int.class}); *//*反射方式 操作獲取到的方法 *//* Object result = add.invoke(reflection,new Object[]{1,2}); System.out.println((Integer)result); //結果為3 }*/ /* 完成對 gflection 的拷貝工作 */ public Object copy (Object object) throws Exception { Class<?> aClass = object.getClass(); System.out.println(aClass); /* 獲取構造方法 */ Constructor con = aClass.getConstructor(new Class[]{String.class,int.class}); Object gbj = con.newInstance(new Object[]{"楊一",1}); System.out.println(gbj); /*獲得獨享的所有成員變量*/ Field[] fields = aClass.getDeclaredFields(); for (Field field :fields){ String name = field.getName(); System.out.println(name); } return null; } public static void main(String[] args) throws Exception{ Reflections reflections = new Reflections(); reflections.copy(new gflection()); } } /* 類 */ class gflection { private int age; private String name; /* 第一個構造方法 */ public gflection(){ } /* 帶參數的構造方法 */ public gflection(String name,int age){ this.age = age; this.name = name; } /*get set 方法*/ public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }