天天看點

了解java反射的用法

小編最近重新看了下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處理,實際應用可以根據需要捕獲各種異常進行處理。小夥伴們了解反射的應用後可以做參數化封裝而做一些工具類使用。

希望在此可以幫助到萌新的應用。