Obejct invoke(Object obj, Object …args);该方法中的 obj 是执行该方法的主调,后面的 args 是
执行该方法时传入该方法的实参。
当通过 Method 的 invoke 方法来调用对应的方法时,Java 会要求程序必须有调用该
方法的权限,如果程序确实需要调用某个对象的 invoke 方法,可以先调用 Method 对象的如
下方法:
setAccessible(boolean flag):将 flag 对象的 accessible 标志设置为指示的 Boolean 值。
true 表示该 Method 在使用时应该取消 Java 语言访问权限检查。
访问属性值
通过对象的 getFields()或 getField()方法可以获取该类所包括的全部 Field(属性)或
指定的 Field,Field 提供如下两组方法来访问属性:
getXxx(Object obj):获取 obj 对象该 Field 的属性值
setXxx(Object obj, Xxx val):将 obj 对象的该 Field 设置成 val 值
使用这两个方法可以随意地访问指定对象的所有属性,包括 private 访问控制的属
性
必须通过 setAccessible(true)取消访问前检查
操作数组
在 java.lang.reflect 包下还提供了一个 Array 类,Array 对象可以代表所有的数组
使用反射生成 JDK 动态代理
在 Java 的 java.lang.reflect 包下提供了一个 Proxy 类和一个 InvocationHandler 接口,
通过使用这个类和接口可以生成 JDK 动态代理类或动态代理对象
Proxy 提供
static Object newProxyInstance(ClassLoader loader, Class[] interfaces,
InvocationHandler h):直接创建一个动态代理对象,该代理对象的实现类实现了 interfaces 指
定的系列接口 ,执行代理对象的每个方法时都会被替换执行 InvocationHandler 对象的
invoke 方法。
通常而言,当我们使用 Proxy 生成一个动态代理时,往往并不会凭空产生一个动态
代理,通常都是为制定的目标对象来生成动态代理。
这种动态代理在 AOP(Aspect Orient Program,即面向切面编程)里被称为 AOP 代理,
AOP 代理可代替目标对象,AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与
目标对象的方法存在差异:AOP 代理里的方法可以在执行目标方法之前,之后插入一些通
用处理。