
正文
代理模式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方法.
相关问答
Q1: 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() beg in))
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() b egin))
System out println( CglibProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callCglibProxy: +(System currentTimeMillis() beg in))
begin=System currentTimeMillis()
d=createJavassistDynProxy() //测试Javaassist动态代理
System out println( createJavassistDynProxy: +(System currentTimeMil lis() begin))
System out println( JavassistDynProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistDynProxy: +(System currentTimeMilli s() begin))
begin=System currentTimeMillis()
d=createJavassistBytecodeDynamicProxy() //测试Javassist动态代理
System out println( createJavassistBytecodeDynamicProxy: +(System cu rrentTimeMillis() begin))
System out println( JavassistBytecodeDynamicProxy class: +d getClass()
getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistBytecodeDynamicProxy: +(System curr entTimeMillis() begin))
}
返回目录 Java程序性能优化 让代理模式java代码详解你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj/201311/27830
Q2: Java代理的三种模式有什么?
Java代理模式java代码详解的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出代理模式java代码详解,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇文章中讲述。
代理模式是什么
代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。
比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing()。
假如代理模式java代码详解你希望,通过你的某种方式生产出来的歌手对象,在唱歌前后还要想观众问好和答谢,也即对目标对象Singer的sing方法进行功能扩展。
但是往往你又不能直接对源代码进行修改,可能是你希望原来的对象还保持原来的样子,又或许你提供的只是一个可插拔的插件,甚至你有可能都不知道你要对哪个目标对象进行扩展。这时就需要用到java的代理模式了。网上好多用生活中的经理人的例子来解释“代理”,看似通俗易懂,但我觉得不适合程序员去理解。程序员应该从代码的本质入手。
Q3: 代理模式、装饰者模式
代理模式和装饰者模式
Java 动态代理详解
装饰者模式:
在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。
代理模式:
为其他对象提供代理, 以控制对这个对象的访问。
代理模式和装饰者模式的相同:
一个新的对象封装原有的对象。
代理模式和装饰者模式的不同:
代理模式是为了实现对象的访问控制;
装饰者模式是继承的一种替代方案;
CGLIB动态代理介绍
生成字节码文件
springboot啥时候用jdk动态代理, 啥时候用cglib呢
enhancer字节码增强器
enhancer.setSuperclass(superClass)继承被代理的类
methodInterceptor增强的内容。
enhancer生成代理对象,生成的代理对象长啥样?
Cglib 总结
CGlib可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类.
由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的
做了方法访问优化,使用建立方法索引的方式避免了传统JDK动态代理需要通过Method方法反射调用.
提供callback 和filter设计,可以灵活地给不同的方法绑定不同的callback。编码更方便灵活。
CGLIB会默认代理Object中equals,toString,hashCode,clone等方法。比JDK代理多了clone。
关于代理模式java代码详解和java的代理机制的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






