jdk动态代理应用

来源:互联网 发布:淘宝开店怎么描述小铺 编辑:程序博客网 时间:2024/06/03 14:36

jdk动态代理是动态代理技术的一种,和CGLIB动态代理不同的是,它要求目标对象和代理对象实现同一个接口。由于能力有限,今天就写一个小例子,其原理以后搞明白再写吧。

首先创建目标接口

public interface UserManager {    void addUser();}
创建接口的实现类

public class UserManagerImpl implements UserManager {    public void addUser() {        System.out.println("添加用户...");    }}
jdk动态代理的关键是Proxy和InvocationHandler,再创建一个InvocationHandler的实现类

public class TransactionHandler implements InvocationHandler {    private Object target;    public TransactionHandler(Object target) {        super();        this.target = target;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("开始事务");        Object result = method.invoke(target, args);        System.out.println("结束事务");        return result;    }    public Object getProxy() {        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),                target.getClass().getInterfaces(), this);    }}
其中target是目标对象,invoke是当调用目标对象的目标方法时由代理对象调用的,用来增强目标方法,getProxy方法获得一个代理对象。

public class Client {    public static void main(String[] args) {        UserManager userManager = new UserManagerImpl();        TransactionHandler handler = new TransactionHandler(userManager);        UserManager manager = (UserManager) handler.getProxy();        manager.addUser();    }}
结果

开始事务
添加用户...
结束事务

由结果可以看出,应用Jdk动态代理在没有改变原代码的条件下增强了目标方法

原创粉丝点击