瞭解java反射的用法
阿新 • • 發佈:2018-12-19
小編最近重新看了下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處理,實際應用可以根據需要捕獲各種異常進行處理。小夥伴們瞭解反射的應用後可以做引數化封裝而做一些工具類使用。
希望在此可以幫助到萌新的應用。