jdk:
public interface Person { void sing(); void sleep(); void dance(); }
public class PersonOne implements Person { @Override public void sing() { System.out.println("personone is singing"); } @Override public void sleep() { System.out.println("personone is sleeping"); } @Override public void dance() { System.out.println("personone is dancing"); } }
public class JdkProxy implements InvocationHandler { private Object obj; public JdkProxy(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("调用前"); Object result = method.invoke(obj, args); System.out.println("调用后"); return result; } public Object getProxy(){ ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); return Proxy.newProxyInstance(classLoader, obj.getClass().getInterfaces(), this); } }
@RunWith(JUnit4.class) public class Test { @org.junit.Test public void test(){ Person person = (Person) new JdkProxy(new PersonOne()).getProxy(); person.sleep(); person.dance(); person.sing(); } }
cglib: 需要cglib.jar, asm.jar
public class PersonOne { public void sing() { System.out.println("personone is singing"); } public void sleep() { System.out.println("personone is sleeping"); } public void dance() { System.out.println("personone is dancing"); } }
public class CglibProxy { private Object obj; public CglibProxy(Object obj) { this.obj = obj; } public Object getProxy(){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(obj.getClass()); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("调用前"); method.invoke(obj, args); System.out.println("调用后"); return proxy; } }); return enhancer.create(); } }
@RunWith(JUnit4.class) public class Test { @org.junit.Test public void test(){ PersonOne personOne = (PersonOne) new CglibProxy(new PersonOne()).getProxy(); personOne.dance(); personOne.sing(); personOne.sleep(); } }