千锋扣丁学堂Java培训之jdk动态代理源码分析过程

2019-08-15 15:56:00 3462浏览

今天千锋扣丁学堂Java培训老师给大家分享一篇关于jdk动态代理源码分析过程的详细介绍,下面我们一起来看一下吧。



代理对象的生成方法是:

Proxy.newProxyInstance(...),进入这个方法内部,一步一步往下走会发现会调用

ProxyGenerator.generateProxyClass(),这个方法用来生成代理类的字节码。

下面通过调用ProxyGenerator.generateProxyClass()方法在本地生成代理类。

1.首先要有一个接口



2.生成代理类的方法如下



3.将生成的代理类导入到idea中查看是长这样

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
 
import com.example.springboottest.config.OrderService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
 
protected static class $OrderService extends Proxy implements OrderService {
  private static Method m1;
  private static Method m3;
  private static Method m2;
  private static Method m0;
 
  public $OrderService(InvocationHandler var1) throws {
    super(var1);
  }
 
  public final boolean equals(Object var1) throws {
    try {
      return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
    } catch (RuntimeException | Error var3) {
      throw var3;
    } catch (Throwable var4) {
      throw new UndeclaredThrowableException(var4);
    }
  }
 
  public final void query() throws {
    try {
      super.h.invoke(this, m3, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }
 
  public final String toString() throws {
    try {
      return (String)super.h.invoke(this, m2, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }
 
  public final int hashCode() throws {
    try {
      return (Integer)super.h.invoke(this, m0, (Object[])null);
    } catch (RuntimeException | Error var2) {
      throw var2;
    } catch (Throwable var3) {
      throw new UndeclaredThrowableException(var3);
    }
  }
 
  static {
    try {
      m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
      m3 = Class.forName("com.example.springboottest.config.OrderService").getMethod("query");
      m2 = Class.forName("java.lang.Object").getMethod("toString");
      m0 = Class.forName("java.lang.Object").getMethod("hashCode");
    } catch (NoSuchMethodException var2) {
      throw new NoSuchMethodError(var2.getMessage());
    } catch (ClassNotFoundException var3) {
      throw new NoClassDefFoundError(var3.getMessage());
    }
  }
}

可以发现在代理类中的构造方法中传入了我们实现的InvocationHandler,在调用方法时会回调invoke方法。

还可以发现代理类中继承了Proxy,由于java中是单继承的,所以java动态代理是针对接口的。

以上就是关于千锋扣丁学堂Java培训之jdk动态代理源码分析过程的全部内容,希望对大家的学习有所帮助,想要了解更多关于Java开发方面内容的小伙伴,请关注扣丁学堂Java培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的Java讲师为您指导,此外扣丁学堂老师精心推出的Java视频教程定能让你快速掌握Java从入门到精通开发实战技能。扣丁学堂Java技术交流群:850353792。


                          JavaEE/微服务/源码解析/分布式/企业级架构【VIP体验课】


     【关注微信公众号获取更多学习资料】        【扫码进入JavaEE/微服务VIP免费公开课】  



查看更多关于“Java开发资讯”的相关文章>>

标签: Java培训 Java视频教程 Java多线程 Java面试题 Java学习视频 springBoot项目

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号