欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

java 動態代理 jdk和cglib的效率

洪振霞1年前8瀏覽0評論

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動態代理更加高效。