java基础-代理

1.代理简介

2.静态代理

3.动态代理

3.1.jdk

使用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,JDK创建代理对象效率较高,但是执行效率较低

使用流程:实现InvocationHandler接口,重写invoke(),使用Proxy.newProxyInstance()产生代理对象,被代理的对象必须要实现接口

3.2.cglib

CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类,因为是继承的关系,所以不能代理final修饰的类,CGLIB创建代理对象效率较低,执行效率高,CGLib必须依赖于CGLib的类库

使用流程:实现MethodInterceptor接口,重写intercept(),使用Enhancer对象.create()产生代理对象

Jdk动态代理的拦截对象是通过反射的机制来调用被拦截方法的,反射的效率比较低,所以cglib采用了FastClass的机制来实现对被拦截方法的调用。FastClass机制就是对一个类的方法建立索引,通过索引来直接调用相应的方法

Fastclass机制描述下,equals()方法、hashcode()方法、getClass()方法不能被代理

3.3.javaassistant

Javassit其实就是一个二方包,是使用Java编码方式创建新类或者修改现有类。在性能上Javassist高于反射但低于ASM,因为Javassist增加了一层抽象

3.4.asm

ASM是一个Java字节码操控框架,它可以直接产生二进制class文件,也可以在类被加载入Java虚拟机之前动态改变类行为(也就是生成的代码可以覆盖原来的类也可以是原始类的子类)。不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解

3.5.总结

从Java动态代理实现上来看,可分为两种策略:一种是操作字节码创建新类或者修改现有类,比如ASM/byte-buddy/Java动态代理;另一种是使用Java编码方式创建新类或者修改现有类,比如javassist

关于动态代理的性能问题,如果是生成的class是被代理类的子类或者(添加了代理逻辑的)被代理类本身,理论上性能和直接调用被代理类逻辑是一样的;如果生成的class是通过反射等方式进行调用被代理类逻辑的,那么性能上相对来说是比较弱的

posted @   下雨天打盹  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示