学习、分享

站在巨人的肩膀上

JAVA 反射与动态代理

反射–Reflection

上面是正常使用构造函数定义对象,调用对象方法,以及获取对象的成员变量的方法。以下,使用反射可以达到同样的效果。

在上面的例子中,使用MyClass.class.getConstructor(int.class)来获取本来为public MyClass(int count)的构造方法。必须保证参数对应,否则会报出IllegalArgumentException的异常,getConstructor使用参数来区分对应的构造函数。有了构造函数,就可以通过constructor.newInstance(5)来定义对象了。使用同样的方法,我们可以获取到MyClass.class的方法和成员对象。

使用反射应该建立一种思想,先建立一个和目标对应的反射对象,然后使用反射对象。

核心方法:

但是,使用上面的几种方法只能访问public的方法、变量。需要访问非公有方法需要使用对应的getDeclaredXXX()版本,使用方法一样。而对于private修饰的变量,通过field.getXX()获取值时会出现权限不足的IllegalAccessException异常,此时需要在调用field.getXX()之前调用field.setAccessible(true),才能正常访问。

重要方法:

下面给出一张反射的方法汇总

点击查看

动态代理–Proxy

Java 动态代理指创建一个代理对象来接管原对象的方法,以达到灵活控制的目的。
其原理是使用JAVA反射得到对象的方法,以便在其方法执行前后添加自定义代码。

如下是一个禁止List使用add方法的例子,返回一个代理的List接管了之前的List:

使用动态代理只支持接口对象。

创建代理对象的方法是

因此,代理对象可以实现多个接口,即第二个列表中的所有接口。

InvocationHandler是方法调用程序处理器。

本文参考:

Java深度历险(七)——Java反射与动态代理
Java反射–系列教程——make_dream【译】

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注