JDK動態代理和CGLib代理
JDK動態代理:
(必須繼承介面原因:生成的代理需要繼承java.lang.reflect.Proxy
類並實現被代理類實現的介面,由於java是單繼承的所以只能代理介面)
1.針對介面實現代理,原理是實現被代理類實現的介面;
2.不能對沒有實現介面的類進行代理;
3.基於反射,實現相同介面
public interface TestInterface {
void print();
}
public class Test implements TestInterface{
@Override
public void print(){
System.out.println("jdk proxy");
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
Object proxy = Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法執行前");
Object res = method.invoke(test, args);
System.out.println("方法執行後");
return res;
}
});
TestInterface p = (TestInterface)proxy;
p.print();
}
}
CGLib代理:
1.針對類進行代理,原理是生成被代理類的子類,並覆蓋其方法;
2.不能對被final修飾的類進行代理,因為不能繼承final修飾的類;
3.基於asm,修改位元組碼生成子類
先新增cglib
的包到專案中
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Test {
public void print(){
System.out.println("jdk proxy");
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(test.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("方法執行前");
Object res = method.invoke(test, args);
System.out.println("方法執行後");
return res;
}
});
Object proxy = enhancer.create();
Test p = (Test)proxy;
p.print();
}
}
相關文章
- JDK動態代理和 CGLIB 代理JDKCGLib
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- 靜態代理和動態代理(jdk/cglib)詳解JDKCGLib
- Java動態代理(JDK和cglib)JavaJDKCGLib
- spring aop原理 JDK動態代理和CGLIB動態代理SpringJDKCGLib
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- 你必須會的 JDK 動態代理和 CGLIB 動態代理JDKCGLib
- 最詳細的代理講解--JDK動態代理和cglib代理JDKCGLib
- cglib動態代理和jdk動態代理的區別與應用CGLibJDK
- 動態代理jdk和cglib的區別JDKCGLib
- Java進階之 JDK動態代理與Cglib動態代理JavaJDKCGLib
- JDK 和 CGLib 實現動態代理和區別JDKCGLib
- Java JDK Proxy和CGLib動態代理示例講解JavaJDKCGLib
- Jdk代理和CGLIB代理的區別JDKCGLib
- CGLib 動態代理CGLib
- 面試造火箭系列,栽在了cglib和jdk動態代理面試CGLibJDK
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- 【4】JDK和CGLIB生成動態代理類的區別JDKCGLib
- Spring動態代理的生成-如何判斷是使用JDK動態代理還是CGlib代理SpringJDKCGLib
- 3.靜態代理&動態代理&CGlibCGLib
- Java提高班(六)反射和動態代理(JDK Proxy和Cglib)Java反射JDKCGLib
- SpringAOP中JDK和CGLib動態代理哪個更快?SpringJDKCGLib
- (轉)Java動態代理與CGLib代理JavaCGLib
- 動態代理-cglib分析CGLib
- 動態代理jdk的Proxy與spring的CGlibJDKSpringCGLib
- JDK動態代理JDK
- CGlib動態代理複習CGLib
- Jmh測試JDK,CGLIB,JAVASSIST動態代理方式的效能JDKCGLibJava
- Spring原始碼剖析5:JDK和cglib動態代理原理詳解Spring原始碼JDKCGLib
- JDK動態代理初探JDK
- 《Proxy系列專題》:代理模式(靜態、JDK、CGLib)模式JDKCGLib
- jdk proxy invocationhandler (jdk動態代理)JDK
- 深入理解靜態代理與JDK動態代理JDK
- jdk的動態代理和靜態代理你還寫不出來嘛???JDK
- JDK動態代理詳解JDK
- 深挖JDK動態代理(一)JDK
- CGLib動態代理原理及實現CGLib
- 【深度思考】聊聊CGLIB動態代理原理CGLib