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动态代理在没有改变原代码的条件下增强了目标方法