jAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。java
衆所周知哈 java ,c++,c#這類語言不屬於動態語言;而目前的結論是 在程序運行狀態中能容許改變變量類型和程序結構的被稱之爲動態語言;可是java Reflection 具有看透class 的能力這種能力被稱爲introspection (內省,內觀) (面試重點 須要的同窗能夠自行百度詳細瞭解一下 我能力有限講不明白)(只有java 提供反射機制 像c++,c#等 非動態語言沒有提供)c++
java 反射機制提供的功能 (注意:大前提是在運行狀態下):面試
java 反射機制的主要類 主要位於 java.lang.reflet c#
Class類 表明一個類
Java 經過反射獲取某個類裏全部的方法 直接上代碼 :數組
java獲取class 類的三種方法:測試
/* 實例 操做 */ 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); }
結果 :this
java 反射動態的調用某個類的特定的方法 首先要獲取該類的Method 方法 對於類的成員變量和構造方法相似 首先要獲取 Filed 和 Constroutorspa
/*普通方法 */ 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; }
附上測試代碼:code
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; } }