spring动态代理(重要至极)

动态代理

    • 动态代理:
      • Proxy
      • InvocationHandler
      • invoke()
        • 参数
        • 结果

动态代理:

  • 动态代理类 (以下简称为代理类 )是一个实现在类创建时在运行时指定的接口列表的类,具有如下所述的行为。
    • 代理接口是由代理类实现的接口。
    • 代理实例是代理类的一个实例。
    • 每个代理实例都有一个关联的调用处理程序对象,它实现了接口InvocationHandler 。
    • 通过其代理接口之一的代理实例上的方法调用将被分派到实例调用处理程序的invoke方法,传递代理实例,
    • java.lang.reflect.Method被调用方法的java.lang.reflect.Method对象以及包含参数的类型Object
      Object的数组。 调用处理程序适当地处理编码方法调用,并且返回的结果将作为方法在代理实例上调用的结果返回。

Proxy

Proxy提供了创建动态代理类实例静态方法,它也是由这些方法创建的所有动态代理类的超类。

InvocationHandler

InvocationHandler是由代理实例的调用处理程序实现的接口 。 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法

invoke()

Object invoke(Object proxy,
              方法 method,
              Object[] args)

throws Throwable处理代理实例上的方法调用并返回结果。 当在与之关联的代理实例上调用方法时,将在调用处理程序中调用此方法。

参数

  • proxy - 调用该方法的代理实例
  • method -所述方法对应于调用代理实例上的接口方法的实例。 方法对象的声明类将是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。
  • args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。 原始类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。

结果

  • 从代理实例上的方法调用返回的值。 如果接口方法的声明返回类型是原始类型,则此方法返回的值必须是对应的基本包装类的实例; 否则,它必须是可声明返回类型的类型。
  • 如果此方法返回的值是null和接口方法的返回类型是基本类型,那么NullPointerException将由代理实例的方法调用抛出。
  • 如上所述,如果此方法返回的值,否则不会与接口方法的声明的返回类型兼容,一个ClassCastException将代理实例的方法调用将抛出。

你可能感兴趣的:(spring,设计模式,反射,spring,java)