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反射的速度要快很多.
?
?
?