认识动态代理随笔

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);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容