关键词搜索

源码搜索 ×
×

Java之jdk和CGLib实现动态代理

发布2019-11-28浏览1974次

详情内容

1 jdk实现动态代理源码实现

这里需要用到InvocationHandler接口

  1. public interface Hello {
  2. public void sayHello();
  3. }
  1. public class HelloImpl implements Hello {
  2. @Override
  3. public void sayHello() {
  4. System.out.println("hello word");
  5. }
  6. }

 

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. public class HelloInvocationHandler implements InvocationHandler{
  4. private Object object;
  5. PeopleInvocationHandler(Object object){
  6. this.object = object;
  7. }
  8. @Override
  9. public Object invoke(Object proxy, Method method, Object[] args)
  10. throws Throwable {
  11. System.out.println("-------- start ---------");
  12. Object invoke = method.invoke(people, args);
  13. System.out.println("-------- end ---------");
  14. return invoke;
  15. }
  16. }
  1. import java.lang.reflect.Proxy;
  2. public class Test {
  3. public static void main(String[] args) {
  4. HelloImpl hello = new HelloImpl();
  5. HelloInvocationHandler invocationHandler = new HelloInvocationHandler(hello);
  6. Hello proxy = (Hello) Proxy.newProxyInstance(HelloImpl.getClass().getClassLoader(), HelloImpl.getClass().getInterfaces(), invocationHandler);
  7. proxy.sayHello();
  8. }
  9. }

 

 

 

 

CGLib实现动态代理源码实现

这里需要用到MethodInterceptor接口和Enhancer

  1. public class Hello {
  2. public Hello() {
  3. System.out.println("Hello...");
  4. }
  5. public void print() {
  6. System.out.println("hello word");
  7. }
  8. }
  1. public class CglibProxyIntercepter implements MethodInterceptor {
  2. @Override
  3. public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  4. //对目标方法进行拦截处理
  5. System.out.println("before...");
  6. Object object = methodProxy.invokeSuper(sub, objects);
  7. System.out.println("after...");
  8. return object;
  9. }
  10. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. //创建加强器,用来创建动态代理类
  4. Enhancer enhancer = new Enhancer();
  5. //为加强器指定要代理的业务类
  6. enhancer.setSuperclass(Hello.class);
  7. //设置回调
  8. enhancer.setCallback(new CglibProxyIntercepter());
  9. //创建代理对象
  10. Hello proxy= (Hello) enhancer.create();
  11. proxy.print();
  12. }
  13. }

 result

  1. before...
  2. hello word
  3. after...

 

 

 

3 对比jdk实现动态代理CGLib实现动态代理

1)、JDK

 内部主要是通过反射来实现。

 

2)、CGLib

CGLib是依靠asm字节码处理框架实现的高性能Code生成类库,可以在运行时扩展Java类或者实现接口?当然可以,CGLib对用户隐藏了asm复杂的内部实现,提供了Developer友好、面向特定功能的实现,比如方法拦截(Interpreter)、懒加载(Lazyloader & Dispatcher)等,AOP中的方法拦截,Hibernate中的延迟加载都利用了CGLib

特点:可以不通过接口实现动态代理的优点之外,还有处理速度快、效率高的优点!因为生成代码比Java反射的速度要快很多.

 

 

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载