background image

 
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 代理里的方法可以在执行目标方法之前,之后插入一些通
用处理。