上一篇文章介紹了反射的基本概念以及獲取類相關信息的反射API,這一章節主要記錄如何對類的成員進行操做的相關反射API。java
反射API中提供了以下接口,用於對類的成員進行操做。框架
java.lang.reflect.Member
該接口主要有如下三個實現類,用於對類成員中的字段,方法和構造器進行操做。函數
Tips: 在Java SE 7的手冊中指出,構造器不是類的成員,這和Member的實現類想表達的意思不一樣。工具
字段擁有類型以及值,使用如下類可以獲取類中字段的類型信息,獲取字段的值以及對字段進行賦值操做。spa
java.lang.reflect.Field
方法有返回值,參數,而且可能會拋出異常,使用如下類能夠獲取方法參數以及返回值的類型信息,也能夠調用指定對象的方法。code
java.lang.reflect.Method
使用以下類能夠操做類的構造器,提供與操做method相似的方法,但有如下兩點例外,構造器沒有有返回值,而且對構造器的調用能夠建立指定類的實例。對象
java.lang.reflect.Constructor
public class Main { public static String abc = "123"; private static List<String> a; public static void main(String[] args) throws NoSuchFieldException { Class c = Main.class; Field field = c.getField("abc"); Field field1 = c.getDeclaredField("a"); System.out.println(field.getType()); System.out.println(field.getGenericType()); System.out.println(); System.out.println(field1.getType()); System.out.println(field1.getGenericType()); } }
如上代碼所示,獲取對應字段的Field類,具體使用區別在上一張文末介紹了。
getType直接輸出這個字段的類類型。
getGenericType直接輸出這個字段的類型,若是是泛型字段的話,輸出帶有泛型實際參數的類型,若是不是泛型則會在內部調用getType。結果以下所示。blog
class java.lang.String class java.lang.String interface java.util.List java.util.List<java.lang.String>
類中字段有許多的修飾符,好比 public,private,transient等,java提供了API獲取類的修飾符,不過獲取出來的是一個int型數字,好在java提供了Modifier類對得到的整型進行判斷,以下代碼所示,有興趣的能夠對Modifier源碼進行瀏覽。接口
public class Main { public static int a = 1; public static void main(String[] args) throws NoSuchFieldException { Class c = Main.class; Field field = c.getField("a"); System.out.println(Modifier.isPublic(field.getModifiers())); System.out.println(Modifier.isStatic(field.getModifiers())); } }
反射能夠對字段進行讀寫,以下代碼所示,能夠用過setX和getX方法對字段進行讀寫,不過要注意讀寫先後的類型是否匹配,否則會報異常。ip
private static int a = 1; public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Class c = Main.class; Field field = c.getDeclaredField("a"); int b = field.getInt(Main.class); System.out.println(b); field.setInt(Main.class, 2); System.out.println(a); field.setFloat(Main.class, (float) 1.1); // 報異常 }
以後操做方法的類是Method,操做構造器的類是Constructor,經過這些API提供的get方法,能夠得到方法和構造器的相關信息,所以在筆記裏也再也不贅述。
構造器和方法的反射類不一樣點在於,Constructor能夠建立實例,代碼以下所示。
public class Main { public Main() { } public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException { Class c = Main.class; Constructor[] ctors = c.getConstructors(); Constructor ctor = null; for (int i = 0; i < ctors.length; i++) { ctor = ctors[i]; if (ctor.getGenericParameterTypes().length == 0) // 須要找到默認構造函數建立實例 break; } System.out.println(ctor.newInstance().getClass().getCanonicalName()); } }
以上就是一些看反射API的一些記錄,這個工具自己使用上仍是很簡單的,但意義仍是比較大的,是不少框架存在的基礎,下一篇以struts爲例子,寫一個小demo,展現反射在其中的運用。