动态代理
来源:互联网 发布:帽子vpn软件下载 编辑:程序博客网 时间:2024/06/05 04:18
动态代理分为JDK代理和CGLIB代理两种
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
一)JDK代理实现:
1.接口
public interface Service { public abstract void add();}2.实现类
public class ServiceImpl implements Service { @Override public void add() { System.out.println("This is add service"); }}3.代理类
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler { private Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target,args); return result; } public Object getProxy(Object target){ this.target = target; ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class<?>[] interfaces = target.getClass().getInterfaces(); return Proxy.newProxyInstance(loader,interfaces,this); }}4.调用
public class TestProxy { public static void main(String[] args) { MyInvocationHandler handler = new MyInvocationHandler(); Service proxy = (Service)handler.getProxy(new ServiceImpl()); proxy.add(); }}
二)CGLIB代理实现
1.接口
public interface BookFacade { public abstract void addBook();}
2.实现类
public class BookFacadeImpl implements BookFacade { @Override public void addBook() { System.out.println("增加图书的普通方法..."); }}
3.代理类
import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class BookFacadeProxy implements MethodInterceptor{ private Object target; /** * 创建代理对象 * * @param target * @return */ public Object getProxy(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事物开始"); Object o = proxy.invokeSuper(obj, args); System.out.println("事物结束"); return o; }}
4.调用public class TestCglib { public static void main(String[] args) { BookFacadeProxy cglib=new BookFacadeProxy(); BookFacadeImpl bookCglib=(BookFacadeImpl)cglib.getProxy(new BookFacadeImpl()); bookCglib.addBook(); }}
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 多线程个人问题汇总
- python3 for 循环中的 else 语句
- 深夜切题——ly与lyon的终极巅峰对决
- Kidnapping Gym
- [LeedCode]274. H-Index
- 动态代理
- CCFCSP201409-1相邻数对
- 关于TP项目发布到SAE访问时候出现空白报错
- Java 自动装箱与拆箱的实现原理
- 数字图像的基本运算
- 背包问题
- jQuery (参考)
- openssl编译和安装
- 宝洁八大问