Java之jdk和CGLib实现动态代理
生活随笔
收集整理的這篇文章主要介紹了
Java之jdk和CGLib实现动态代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1?jdk實現動態代理源碼實現
這里需要用到InvocationHandler接口
public interface Hello {public void sayHello(); } public class HelloImpl implements Hello {@Overridepublic void sayHello() {System.out.println("hello word");} }?
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;public class HelloInvocationHandler implements InvocationHandler{private Object object;PeopleInvocationHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("-------- start ---------");Object invoke = method.invoke(people, args);System.out.println("-------- end ---------");return invoke;} } import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {HelloImpl hello = new HelloImpl();HelloInvocationHandler invocationHandler = new HelloInvocationHandler(hello);Hello proxy = (Hello) Proxy.newProxyInstance(HelloImpl.getClass().getClassLoader(), HelloImpl.getClass().getInterfaces(), invocationHandler);proxy.sayHello();} }?
?
?
?
2?CGLib實現動態代理源碼實現
這里需要用到MethodInterceptor接口和Enhancer
public class Hello {public Hello() {System.out.println("Hello...");}public void print() {System.out.println("hello word");} } public class CglibProxyIntercepter implements MethodInterceptor {@Overridepublic Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//對目標方法進行攔截處理 System.out.println("before...");Object object = methodProxy.invokeSuper(sub, objects);System.out.println("after...");return object;} } public class Test {public static void main(String[] args) {//創建加強器,用來創建動態代理類Enhancer enhancer = new Enhancer();//為加強器指定要代理的業務類enhancer.setSuperclass(Hello.class);//設置回調enhancer.setCallback(new CglibProxyIntercepter());//創建代理對象Hello proxy= (Hello) enhancer.create();proxy.print();} }?result
before... hello word after...?
?
?
3 對比jdk實現動態代理CGLib實現動態代理
1)、JDK
?內部主要是通過反射來實現。
?
2)、CGLib
CGLib是依靠asm字節碼處理框架實現的高性能Code生成類庫,可以在運行時擴展Java類或者實現接口?當然可以,CGLib對用戶隱藏了asm復雜的內部實現,提供了Developer友好、面向特定功能的實現,比如方法攔截(Interpreter)、懶加載(Lazyloader & Dispatcher)等,AOP中的方法攔截,Hibernate中的延遲加載都利用了CGLib
特點:可以不通過接口實現動態代理的優點之外,還有處理速度快、效率高的優點!因為生成代碼比Java反射的速度要快很多.
?
?
?
總結
以上是生活随笔為你收集整理的Java之jdk和CGLib实现动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java线程安全以及线程安全的实现方式和
- 下一篇: Android之通过Binder机制实现