動態道理分爲 cglib 和jdk 我們先看jdk public interface OrderService { /** *抽象的共同方法 */ void order() throws Throwable; }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkInvocationHandler implements InvocationHandler { /** * 被代理的對象 ,目標代理對象 */ private Object target; public JdkInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---執行日誌代碼START"+proxy.getClass().toString()); Object result = method.invoke(target, args); System.out.println("---執行日誌代碼END"); return result; } /** * 使用jdk動態代理創建代理類 * * @param <T> * @return */ public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } }
Cglib 方式 引入 pom
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> </dependency> import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(">>>Cglib 日誌手機START---"); methodProxy.invokeSuper(o,objects); System.out.println(">>>Cglib 日誌手機END---"); return null; } }
測試代碼
public class client { public static void main(String[] args) throws Throwable { /** * 動態代理 jdk的動態代理爲什麼用父類進行接受 , 因爲生成的代理類一般都是接口形式,代理類必須實現接口 */ System.getProperties().put("sum.misc.ProxyGenerator.saveGeneratedFiles","true"); OrderService orderService = new JdkInvocationHandler(new OrderServiceImpl()).getProxy(); orderService.order(); /** * 動態代理 Cglib方式 */ CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OrderServiceImpl.class); enhancer.setCallback(cglibMethodInterceptor); OrderServiceImpl orderService = (OrderServiceImpl) enhancer.create(); orderService.order(); } }