代理模式java代码详解 java的代理机制

Java 代理模式这种不太像真正代理模式java代码详解的代理模式吧?
倒像是模拟代理模式java代码详解的.
net为代理类Proxy的对象,调用net.browse时首先调用net的check方法进行一些检测之类的工作然后才调用委托对象的browse方法进行真正的业务处理,实际上最后总要执行委托对象指定的方法的.
代理类主要为委托类预处理消息,过滤消息,然后把消息转给委托类以及事后处理等.Proxy类并不真正实现服务的
Java提供的Proxy类和InvocationHandler接口提供生成动态代理类
具体你可以看看java.lang.reflect下的那些类,接口,其实主要还是用到java的反射机制,很简单的.
Real类实现了Network接口,虽然Proxy构造方法参数类型为Network,java中实现了某接口的类都是可以直接转换为接口类型的.
Network real=new Real();
所以可以直接传递一个Real类的实例化对象.
this.network.browse() ; 实际上就是调用Real类的实例化对象的browse方法.
Java程序性能优化-代理模式(5)代理模式( )
在以上代码中 使用CtField make()方法和CtNewMehod make()方法在运行时生成代理模式java代码详解了代理类代理模式java代码详解的字段和方法 这些逻辑由Javassist代理模式java代码详解的CtClass对象处理 将Java代码转换为对应的字节码 并生成动态代理类的实例
注意 与静态代理相比 动态代理可以很大幅度地减少代码行数 并提升系统的灵活性
在Java中 动态代理类的生成主要涉及对ClassLoader的使用 这里以CGLIB为例 简要阐述动态类的加载过程 使用CGLIB生成动态代理 首先需要生成Enhancer类实例 并指定用于处理代理业务的回调类 在Enhancer create()方法中 会使用DefaultGeneratorStrategy Generate()方法生成动态代理类的字节码 并保存在byte数组中 接着使用ReflectUtils defineClass()方法 通过反射 调用ClassLoader defineClass()方法 将字节码装载到ClassLoader中 完成类的加载 最后使用ReflectUtils newInstance()方法 通过反射 生成动态类的实例 并返回该实例 无论使用何种方法生成动态代理 虽然实现细节不同 但主要逻辑都如图 所示
图实现动态代理的基本步骤
前文介绍的几种动态代理的生成方法 性能有一定差异 为代理模式java代码详解了能更好地测试它们的性能 去掉DBQuery类中的sleep()代码 并使用以下方法测试
public static final int CIRCLE= ;
public static void main(String[] args) throws Exception {
IDBQuery d=null;
long begin=System currentTimeMillis()
d=createJdkProxy()//测试JDK动态代理
System out println( createJdkProxy: +(System currentTimeMillis() begin))
System out println( JdkProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJdkProxy: +(System currentTimeMillis() begin))
begin=System currentTimeMillis()
d=createCglibProxy()//测试CGLIB动态代理
System out println( createCglibProxy: +(System currentTimeMillis() begin))
System out println( CglibProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callCglibProxy: +(System currentTimeMillis() begin))
begin=System currentTimeMillis()
d=createJavassistDynProxy()//测试Javaassist动态代理
System out println( createJavassistDynProxy: +(System currentTimeMillis() begin))
System out println( JavassistDynProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)

推荐阅读