public interface AddService { Integer add(int a, int b); }
public class AddServiceImpl implements AddService { @Override public Integer add(int a, int b) { return a + b; } }
public class AddServiceProxy implements AddService{ private AddService addService; public AddServiceProxy(AddService addService) { this.addService = addService; } public static void main(String[] args) { AddService addService = new AddServiceImpl(); AddService addServiceProxy = new AddServiceProxy(addService); addServiceProxy.add(1, 3); } @Override public Integer add(int a, int b) { System.out.println("before"); int result = addService.add(a, b); System.out.println("result: " + result); System.out.println("after"); return result; } }
jdk動態代理的業務類必須實現接口java
public interface AddService { Integer add(int a, int b); }
業務類的實現類ide
public class AddServiceImpl implements AddService { @Override public Integer add(int a, int b) { return a + b; } }
代理類的生成this
public class AddServiceHandler implements InvocationHandler { private AddService addService; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); Object invoke = method.invoke(addService, args); System.out.println(invoke); System.out.println("after"); return invoke; } public AddServiceHandler(AddService addService) { this.addService = addService; } public AddService getProxy() { return (AddService) Proxy.newProxyInstance(addService.getClass().getClassLoader(), addService.getClass().getInterfaces(), this); } public static void main(String[] args) { AddService service = new AddServiceImpl(); AddServiceHandler addServiceHandler = new AddServiceHandler(service); AddService proxy = addServiceHandler.getProxy(); proxy.add(1, 2); } }
業務類不須要實現接口,但不能業務類須要繼承,因此業務類不能是final及業務類的相應方法不能是final代理
public class AddServiceImpl { public Integer add(int a, int b) { return a + b; } }
public class AddServiceCglib implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before"); Object result = methodProxy.invokeSuper(o, objects); System.out.println("result:" + result); System.out.println("after"); return result; } public Object getInstance(Class clzz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clzz); enhancer.setCallback(this); return enhancer.create(); } public static void main(String[] args) { AddServiceCglib cglib = new AddServiceCglib(); AddServiceImpl addServiceImpl = (AddServiceImpl) cglib.getInstance(AddServiceImpl.class); addServiceImpl.add(1,7); } }