最新消息:发现真没时间折腾VPS,最近又换了个空间。呵呵

通过反射动态调用类的属性和方法

在实际应用中,反射还是很有用的。不过反射不能访问任何公共以外的东西。也就是说反射只能访问public定义的方法和属性

如下两个类,测试类TestMethod:

Java
public class TestMethod {
    private int a;
    private int b;
    // 公共属性
    public String c = "public c";
    // 不带参数的构造方法
    public TestMethod() {
        this(0, 0);
    }
    // 带参数的构造方法
    public TestMethod(int a, int b) {
        this.a = a;
        this.b = b;
    }
    // 静态函数
    public static int add(int a, int b) {
        return a + b;
    }
    // 不带参数的实例函数
    public int time() {
        return a * b;
    }
    // 带参数的实例函数
    public int plus(int c) {
        return a + b + c;
    }
    // 带参数的实例函数
    protected int plus() {
        return a + b;
    }
    public String toString() {
        return String.format("TestMethod[a=%d, b=%d]", a, b);
    }
}

如下两个类,Main测试类:

Java
public class CallTestMethod {
     public static void main(String[] avg) throws Exception {

        Class<?> testMethodClass = Class.forName(TestMethod.class.getName());

        // 用不带参数的构造方法创建实例
        TestMethod objA = (TestMethod) testMethodClass.newInstance();
        System.out.println(objA);

        // 用带参数的构造方法创建实例
        Constructor<?> constr = testMethodClass.getConstructor(new Class[]{int.class, int.class});
        TestMethod objB = (TestMethod) constr.newInstance(new Object[]{1, 2});
        System.out.println(objB);

        // 访问属性
        Field field = testMethodClass.getDeclaredField("c");
        System.out.println(field.get(objB));

        // 调用静态函数
        Method method1 = testMethodClass.getMethod("add", new Class[]{int.class, int.class});
        // invoke函数的第一个参数为实例,所以在静态函数调用时,第一个参数为空
        System.out.println(method1.invoke(null, new Object[]{3, 4}));

        // 调用不带参数的实例函数
        Method method2 = testMethodClass.getMethod("time");
        System.out.println(method2.invoke(objB));

        // 调用带参数的实例函数
        Method method3 = testMethodClass.getMethod("plus", new Class[]{int.class});
        System.out.println(method3.invoke(objB, new Object[]{3}));
     }
}

执行后,结果如下:

TestMethod[a=0, b=0]
TestMethod[a=1, b=2]
7
2
6
public c

转载请注明:宇托的狗窝 » 通过反射动态调用类的属性和方法

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址