# 静态代理
public class QQ { public static void main(String[] args) throws ParseException { Subject realSubject = new RealSubject(); ProxyObj proxyObj = new ProxyObj(realSubject); System.out.println(proxyObj.sellBook()); System.out.println(proxyObj.speak()); } } interface Subject { int sellBook(); String speak(); } class RealSubject implements Subject { public int sellBook() { System.out.println("selling book"); return 1; } public String speak() { System.out.println("qq speaking"); return "qq"; } } class ProxyObj implements Subject { Subject sbj; public ProxyObj(Subject sbj) { this.sbj = sbj; } public int sellBook() { System.out.println("do something before sell book"); int temp = sbj.sellBook(); System.out.println("do something after sell book"); return temp; } public String speak() { return sbj.speak(); } }
# 动态代理 - jdk
public class QQ { public static void main(String[] args) throws ParseException { final Subject realSubject = new RealSubject(); Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Subject.class }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("do something before invoke method"); Object reObj = method.invoke(realSubject, args); System.out.println("do something after invoke method"); return reObj; } }); // Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), // new Class[] { Subject.class }, new MyInvocationHandler(realSubject)); System.out.println(proxyObj.sellBook()); System.out.println(proxyObj.speak()); } } interface Subject { int sellBook(); String speak(); } class RealSubject implements Subject { public int sellBook() { System.out.println("selling book"); return 1; } public String speak() { System.out.println("qq speaking"); return "qq"; } } class MyInvocationHandler implements InvocationHandler { Object obj; public MyInvocationHandler(Object obj) { this.obj = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(obj, args); } }
* 需要注意的地方
1. 如果使用匿名内部类,则被代理类需要使用final修饰
# 动态代理 - cglib
public class QQ { public static void main(String[] args) throws ParseException { RealSubjectt realSubject = (RealSubjectt) CglibProxy.getProxy(new RealSubjectt()); System.out.println(realSubject.sellBook()); System.out.println(realSubject.speak()); } } class RealSubjectt { public int sellBook() { System.out.println("selling book"); return 1; } public String speak() { System.out.println("qq speaking"); return "qq"; } } class CglibProxy implements MethodInterceptor { private Object target; public CglibProxy(Object target) { this.target = target; } public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("do something before " + arg1.getName()); Object result = arg1.invoke(target, arg2); System.out.println("do somethind after " + arg1.getName()); return result; } public static Object getProxy(Object target) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(new CglibProxy(target)); return enhancer.create(); } }