小編最近重新看了下java反射,如何取對象,屬性,方法等,然後做了簡單的test測試,在此分享一下。
程式員不多說,直接上代碼。
我們建一個類Myclass,設定私有屬性a,public屬性b
public class MyClass {
private String a;
public String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
再建立一個test類,main方法如下代碼
try {
Class c3 = Class.forName("thread.MyClass");
// 反射建立對象
// MyClass myClass2 = (MyClass) c3.newInstance();
Object myClass2 = c3.newInstance();
// 擷取類的屬性 public/繼承
Field[] fields = c3.getFields();
for (Field field : fields){
System.out.println("所有的public屬性:"+field);
}
// 擷取類的屬性 public/private 不包括繼承
Field[] fields2 = c3.getDeclaredFields();
for (Field field : fields2){
System.out.println("所有的public/private屬性:"+field);
}
// 擷取指定的public屬性
Field f1 = c3.getField("b");
// 擷取本身的屬性
Field f2 = c3.getDeclaredField("b");
// Field f3 = c3.getField("a");// 擷取不到
Field f3 = c3.getDeclaredField("a");
// f1.setAccessible(true);// 允許通路私有變量,通路共有變量不用加
f1.set(myClass2,"1");
// 設定值
f3.setAccessible(true);// 允許通路私有變量,通路共有變量不用加
f3.set(myClass2,"2");
// 擷取值
String b = (String) f1.get(myClass2);
System.out.println("屬性b的值:"+b);
// 擷取值
String a = (String) f3.get(myClass2);
System.out.println("屬性a的值:"+a);
// 擷取所有方法
Method[] methods = c3.getMethods();
for (Method method : methods){
System.out.println("class的方法:"+method);
}
// 擷取私有變量,get方法
String a1 = (String) c3.getMethod("getA").invoke(myClass2);
System.out.println("屬性a的值:"+a1);
} catch (Exception e) {
e.printStackTrace();
}
這段代碼可以根據注釋看對Myclass做了反射建立對象,2種擷取屬性名的方法,擷取屬性的值,給屬性設定值,擷取class的所有方法以及根據方法名擷取方法并執行。
測試類對所有異常統一exception處理,實際應用可以根據需要捕獲各種異常進行處理。小夥伴們了解反射的應用後可以做參數化封裝而做一些工具類使用。
希望在此可以幫助到萌新的應用。