反射: 當一個字節碼文件加載到內存的時候,jvm會對該字節碼進行解剖,而後會建立一個對象的Class對象,把字節碼文件的信息所有都存儲到該Class對象中,咱們只要獲取到Class對象,咱們就能夠使用字節碼對象設置對象的屬性或者調用對象的方法等操做jvm
這裏記錄下反射的簡單使用,方便查閱ide
1 /******************* 2 獲取class 3 *******************/
4 //Class clazz = Person.class;//方式一,經過類名獲取 5 //Class clazz = new Person().getClass();//方式二,經過對象獲取
6 Class clazz = Class.forName("reflect.Person");//方式三,經過完成限定名獲取。參數爲(包名+類名)。推薦使用,也是最經常使用
7
8 /******************* 9 獲取某class的構造方法 10 ******************/
11 //Constructor[] constructor = clazz.getConstructors();//獲取全部共有構造方法 12 //Constructor[] constructor = clazz.getDeclaredConstructors();//獲取全部構造方法 13 //Constructor constructor = clazz.getConstructor(String.class,String.class);//獲取某一個構造方法(不包括私有構造方法),參數爲null表示獲取無參構造方法
14 Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);//獲取某一個構造方法(包括私有構造方法),參數爲null表示獲取無參構造方法
15 /******************* 16 執行構造方法 17 ******************/
18 constructor.setAccessible(true);//若是構造方法爲私有,則需改變訪問修飾權限
19 Person p =(Person) constructor.newInstance("100","jiuxiangfeng1");//參數爲null表示執行無參構造方法
20
21 /******************* 22 獲取方法 23 ******************/
24 //Method[] method = clazz.getMethods();//獲取全部共有方法 25 //Method[] method = clazz.getDeclaredMethods();//獲取全部方法 26 //Method method = clazz.getMethod("setName",String.class);//獲取某個方法(不包括私有方法),第二個爲可變參數,若是第二個參數爲null表示該方法沒有參數
27 Method method = clazz.getMethod("setName",String.class);//獲取某個方法(包括私有方法),第二個爲可變參數,若是第二個參數爲null表示該方法沒有參數
28 /******************* 29 執行方法 30 ******************/
31 //method.setAccessible(true);//若是方法爲私有,執行前需改變訪問修飾權限,不然會引起異常
32 method.invoke(p, "jiuxiangfeng2");//第一個參數爲方法執行的對象,若是是靜態方法,第一個參數應爲null,第二個參數爲可變參數,若是第二個參數爲null表示該方法沒有參數
33
34 /******************* 35 獲取成員變量 36 ******************/
37 //Field[] field = clazz.getFields();//獲取全部公共成員變量 38 //Field[] field = clazz.getDeclaredFields();//獲取全部成員變量 39 //Field field = clazz.getField("name");//獲取單個公共成員變量。參數爲成員變量名
40 Field field = clazz.getDeclaredField("name");//獲取單個成員變量。參數爲成員變量名
41 /******************* 42 設置成員變量的值 43 ******************/
44 field.setAccessible(true);//若是爲私有成員變量,那麼應該改變其訪問修飾權限爲能夠訪問,不然引起異常
45 field.set(p, "jiuxiangfeng3");//設置某個對象成員變量的值. 參數1爲哪一個對象,參數2爲其成員變量的值
46 System.out.println(p);
以上代碼執行都假設有一個Person.classthis
package reflect; public class Person { public String id; public String name; public Person(String id, String name) { super(); this.id = id; this.name = name; } public Person() { } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.id+"="+this.name; } }