class="java" name="code">public class ProxyTest { public static void main(String[] args) { UserDao dao = new UserDaoImpl(); MyInvocationHandler h = new MyInvocationHandler(dao); UserDao proxy = (UserDao) h.getProxy(); proxy.add(); } }?
public interface UserDao { void add(); }?
public class UserDaoImpl implements UserDao{ /* (non-Javadoc) * @see example.spring.boot.demo.proxy.UserDao#add() */ @Override public void add() { System.out.println("add user-----------"); } }?
public class MyInvocationHandler implements InvocationHandler{ private Object target; /** * @param target */ public MyInvocationHandler(Object target) { super(); this.target = target; } /* (non-Javadoc) * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("befor---------------"); Object ret = method.invoke(target, args); System.out.println("after---------------"); return ret; } public Object getProxy(){ return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this); } }? JDK动态代理流程如下图:
?
? ?值得一说的是这里会把已经生成过的代理对象缓存到WeakCache,相比之前的版本,在代理这块提高了一定的性能。