认识动态代理随笔

2018-11-15  本文已影响0人  wbobo

1. 什么是动态代理

静态代理是一般是由委托类和代理类实现同一个接口,代理类使用组合的方式来对委托类进行扩展代理过滤等

例如:

interface A{

void say();

}

//委托类

class B implements A{

void say(){

System.out.println("good bye");

}

}

//代理类

class BProxy implements A{

A b;

public BProxy(A b){

this.b = b;

}

void say(){

System.out.println("扩展一下");

b.say();

}

}

静态代理是运行前代理类就已经定义好的了,由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,

被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

而动态代理则是在运行时根据java代码中的指示形成的,一般通过Proxy类和InvocationHandler接口来实现

2, 动态代理中invoke方法是如何自动被调用的

invoke方法有3个参数invoke(Object proxy, Method method, Object[] args)

@param  proxy the proxy instance that the method was invoked on

@param  method the {@code Method} instance corresponding to

the interface method invoked on the proxy instance.

根据源码对参数的解释可以知道proxy是Proxy类实例,而method则是代理类所调用的委托类的方法对象

args为方法参数

newProxyInstance方法也有3个参数newProxyInstance(ClassLoader loader,Class[] interfaces,

InvocationHandler h)

@param  loader the class loader to define the proxy class

@param  interfaces the list of interfaces for the proxy class to implement

@param  h the invocation handler to dispatch method invocations to

load 是定义代理类的类加载器,

interface    是代理类需要去实现的一些接口(即委托类实现的接口)

h    是一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,

会关联到哪一个InvocationHandler对象上

通过查看

Class cl = getProxyClass0(loader, intfs);

所生成的代理类$Proxy0.class的源码可知,其继承了Proxy类并实现了给定的接口interfaces,当调用方法时,会执行

关联的InvocationHandler对象的invoke方法即

super.h.invoke(this, m4, (Object[])null);

上一篇下一篇

猜你喜欢

热点阅读