了解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处理,实际应用可以根据需要捕获各种异常进行处理。小伙伴们了解反射的应用后可以做参数化封装而做一些工具类使用。

希望在此可以帮助到萌新的应用。

猜你喜欢

转载自blog.csdn.net/project_shuai/article/details/85091501