动态代理-JDK_proxy&cglib
2015-01-26 00:00
411 查看
摘要: 动态代理的实现方式较常用的方式有两种,用jdk的proxy类实现,必须依赖接口。或者使用cglib的扩展包实现,因为是产生类的子类所以代理的类不能为final类。
( UserServiceImpl implements UserService )
2、使用JDK的Proxy进行代理
3、使用cglib进行代理实现
一、简介
动态代理的实现方式较常用的方式有两种,用jdk的proxy类实现,必须依赖接口。或者使用cglib的扩展包实现,因为是产生类的子类所以代理的类不能为final类。二、示例
1、 其中UserServiceImpl 是 UserService的实现( UserServiceImpl implements UserService )
2、使用JDK的Proxy进行代理
import java.lang.reflect.Proxy; ... public class JDKProxyTestMain { public static void main(String[] args) { UserService proxyUserService = (UserService) Proxy .newProxyInstance(UserServiceImpl.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), new JDKInvocationHandler(new UserServiceImpl())); proxyUserService.save(); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class JDKInvocationHandler implements InvocationHandler { private Object targetObject; public JDKInvocationHandler(Object targetObject) { this.targetObject = targetObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("--1---"); Object result = method.invoke(targetObject, args); System.out.println("--2---"); return result; } }
3、使用cglib进行代理实现
import net.sf.cglib.proxy.Enhancer; ... public class CglibTestMain { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(UserServiceImpl.class); enhancer.setCallback(new CglibMethodInterceptor(new UserServiceImpl())); UserServiceImpl userServiceProxy= (UserServiceImpl) enhancer.create(); userServiceProxy.save(); } }
import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibMethodInterceptor implements MethodInterceptor { private Object targetObj; public CglibMethodInterceptor(Object targetObj) { this.targetObj = targetObj; } @Override public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("---begin---"); Object result = method.invoke(this.targetObj, args); System.out.println("---end---"); return result; } }
相关文章推荐
- 动态代理双剑客--JDK Proxy与CGLIB
- 动态代理双剑客--JDK Proxy与CGLIB
- 动态代理-JDK_proxy&cglib
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- JDK动态代理与cglib的使用以及对其效率的统计,以及Mybatis中动态代理的使用
- Spring---->JDK动态代理和CGLIB字节码生成
- java动态代理(JDK和cglib)
- JDK与Cglib实现的动态代理区别以及例子说明
- java动态代理(JDK和cglib)
- 好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)
- JDK动态代理与CGLIB动态代理应用及源码解析
- Spring 静态代理、jdk与cglib动态代理 spring aop+ioc
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- JDK动态代理与CGLIB的区别
- jdk动态代理和cglib代理区别
- 设计模式——代理模式(静态代理和JDK、CGLib动态代理)
- java动态代理(JDK和cglib)
- java动态代理(JDK, CGLIB, Javassist)
- spring 动态代理如何决定使用jdk代理和cglib(网易面试题)