动态代理

来源:互联网 发布:帽子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