java 基于接口代理(JDK)和基于类的代理(CGLIB)
来源:互联网 发布:依云软件破解 编辑:程序博客网 时间:2024/06/05 09:38
JDK基于接口代理
但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
Cglib动态类代理
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;interface BookInterface {void addBook();void intercept();};public class BookImpl implements BookInterface {public void addBook() {System.out.println("dynamic@BookImpl#addBook");}public void intercept() {System.out.println("dynamic@BookImpl#intercept is intercepted...");}// 测试方法public static void main(String[] args) {BookProxy proxy = new BookProxy();BookInterface impl = (BookInterface) proxy.getInstance(new BookImpl());impl.intercept();}};/** * * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:23:25 * @useFor : * */class BookProxy implements InvocationHandler {/** * 委托类 */private Object target;public Object getInstance(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}public Object invoke(Object obj, Method method, Object[] args)throws Throwable {System.out.println("Before Advice");if ("intercept".equals(method.getName())) {System.out.println("intercept method is intercepted");return null;}// 注意此处的参数是注入的target 而不是objObject result = method.invoke(target, args);System.out.println("After Advice");return result;}}
但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
Cglib动态类代理
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class BookClass {/** * 业务方法 使用cglib则不需要额外定义接口 Description: <br> * * @see */public void addBook() {System.out.println("cglib@BookClass#addBook");}// 测试public static void main(String[] args) {BookProxy proxy = new BookProxy();BookClass bc = (BookClass) proxy.getInstance(new BookClass());bc.addBook();}};/** * * @projectName:ActiveMq * @packageName: activeMQ.topicMessage * @ClassName : BookProxy * @createBy :Test * @createDate :2013-2-24下午01:31:22 * @useFor : Cglib 动态代理类 类代理 * */class BookProxy implements MethodInterceptor {/** * 委托类 */private Object target;public Object getInstance(Object target) {this.target = target;Enhancer en = new Enhancer();en.setSuperclass(target.getClass());en.setCallback(this);return en.create();}public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("Before Advice");// 注意此处的参数是注入的target 而不是objObject result = proxy.invoke(target, args);System.out.println("After Advice");return result;}};
0 0
- java 基于接口代理(JDK)和基于类的代理(CGLIB)
- Java动态代理(JDK接口代理和Cglib类代理)
- 基于Spring AOP的JDK动态代理和CGLIB代理
- 基于JDK和CGLib的链式动态代理
- 基于jdk和cglib实现的动态代理
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- 拼接数组
- Java Comparable(lang) Comparator(util)对比
- uCOS-II整理之任务
- Android设计模式(二十三)-桥接模式
- Android开发周报开源库&App搬运[118-127][2017.5.2更新]
- java 基于接口代理(JDK)和基于类的代理(CGLIB)
- js模块
- Dom4j学习-1
- java从数据库读取时间的时候时间参数后多了一个.0
- BeanCopier对象复制学习
- java移位简介
- java 基于cglib动态代理
- 百度面试:链表翻转
- 五分钟读懂视频大数据分析