Java中的動態代理是一種實現AOP(面向切面編程)的常見方式,可以在不改變原有代碼結構的情況下,在某些地方增加新的功能。
在Java中,動態代理主要有兩種實現方式:JDK和CGLIB。
/** * JDK動態代理示例 */ public class JDKDynamicProxy implements InvocationHandler { private Object target; public JDKDynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在目標方法執行前,打印日志 System.out.println("before " + method.getName() + " invoked"); Object result = method.invoke(target, args); // 在目標方法執行后,打印日志 System.out.println("after " + method.getName() + " invoked"); return result; } }
上述代碼展示了如何使用JDK動態代理增強目標對象的方法,在目標方法執行前和執行后打印日志。
/** * CGLIB動態代理示例 */ public class CGLIBDynamicProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); private Object target; public CGLIBDynamicProxy(Object target) { this.target = target; } public Object getProxy() { enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // 在目標方法執行前,打印日志 System.out.println("before " + method.getName() + " invoked"); Object result = proxy.invoke(target, args); // 在目標方法執行后,打印日志 System.out.println("after " + method.getName() + " invoked"); return result; } }
上述代碼展示了如何使用CGLIB動態代理增強目標對象的方法,在目標方法執行前和執行后打印日志。
從實現層面來看,JDK動態代理是基于接口實現的,而CGLIB動態代理則是通過生成目標對象的子類來實現的。因此,在使用上,JDK動態代理只能代理實現了接口的類,而CGLIB動態代理可以代理沒有實現接口的類。
另外,從性能上來看,JDK動態代理相對于CGLIB動態代理來說可能會有更好的效率,在代理類的創建和執行方法時都比CGLIB動態代理快。但是,在代理對象的數量很大時,CGLIB動態代理可能會比JDK動態代理更加高效。
上一篇css 多行文字換行
下一篇css 多層 透明度