请选择 进入手机版 | 继续访问电脑版

热点推荐

    查看: 54|回复: 0

    Java类加载机制

    [复制链接]

    该用户从未签到

    655

    主题

    655

    帖子

    1965

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1965
    发表于 7 天前 | 显示全部楼层 |阅读模式
    自己实现JavaVM?
    * U+ p1 V6 h% a
    0 _8 T+ i! g4 w9 w4 A9 a% V1 G6 y1. 源文件& s1 h/ f) S; T% J6 p% b

    , M! N3 X9 E- [9 X& u3 d// 普通的JavaBeanpublic class JavaModel {}// 泛型接口public interface ILoading {    void loading(T var1);}// 一个实现了泛型接口的普通Java类public class ClassLoadMechanism implements ILoading {    private static int STATE_NON_FINAL = 10;    private static final int STATIC_BASIC = 10;    private static final String STATIC_STR = "123";    private final int mLoading;    private final String mRef;    ClassLoadMechanism(int loading, String ref) {        this.mLoading = loading;        this.mRef = ref;    }    @Override    public void loading(JavaModel data) {        // TODO    }}2. 反编译源代码
    ( Q! c  V' T  s
    & l8 S& A: j+ o6 Rjavap -v -s -constants -p file:/demo/build/intermediates/javac/debug/classes/com/study/xxxx.class# H- l% a5 x2 q& H2 S! G+ Y+ r+ l

      2 F2 q- o6 E; d0 b& c- k* S- G
    • ILoading.java
      ( i$ b1 q. d3 Z' ?# Y6 j
    泛型接口对应的字节码Classfile /build/intermediates/javac/debug/classes/com/study/ILoading.class  Last modified Feb 23, 2021; size 229 bytes  MD5 checksum b832d9ee8723757796f83e985609ca03  Compiled from "ILoading.java"public interface com.study.ILoading  minor version: 0  major version: 52  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACTConstant pool:   #1 = Class              #10            // com/study/ILoading   #2 = Class              #11            // java/lang/Object   #3 = Utf8               loading   #4 = Utf8               (Ljava/lang/Object;)V   #5 = Utf8               Signature   #6 = Utf8               (TT;)V   #7 = Utf8               Ljava/lang/Object;   #8 = Utf8               SourceFile   #9 = Utf8               ILoading.java  #10 = Utf8               com/study/ILoading  #11 = Utf8               java/lang/Object{  // 泛型接口被擦除成Object类型  public abstract void loading(T);    descriptor: (Ljava/lang/Object;)V // 泛型接口签名    flags: ACC_PUBLIC, ACC_ABSTRACT    Signature: #6                           // (TT;)V}Signature: #7                           // Ljava/lang/Object;SourceFile: "ILoading.java"
    4 j  Y3 ]% b5 J7 `2 |
      8 W& ]! K1 {' ]( ]% M/ n
    • ClassLoadMechanism.java
      1 c2 I4 E3 j) m0 k  ?. N3 v
    Classfile build/intermediates/javac/debug/classes/com/study/ClassLoadMechanism.class  Last modified Feb 23, 2021; size 1001 bytes  MD5 checksum e44b0bf0907325dd4d888adf2ff1f73e  Compiled from "ClassLoadMechanism.java"// 类描述 类的名称,父类,以及实现的接口public class com.study.ClassLoadMechanism extends java.lang.Object implements com.study.ILoading  minor version: 0      // 次版本号  major version: 52    // 主版本号  flags: ACC_PUBLIC, ACC_SUPER// 常量池Constant pool:   #1 = Methodref          #8.#39         // java/lang/Object."":()V   #2 = Fieldref           #7.#40         // com/study/ClassLoadMechanism.mLoading:I   #3 = Fieldref           #7.#41         // com/study/ClassLoadMechanism.mRef:Ljava/lang/String;   #4 = Class              #42            // com/study/JavaModel   #5 = Methodref          #7.#43         // com/study/ClassLoadMechanism.loading:(Lcom/study/JavaModel;)V   #6 = Fieldref           #7.#44         // com/study/ClassLoadMechanism.STATE_NON_FINAL:I   #7 = Class              #45            // com/study/ClassLoadMechanism   #8 = Class              #46            // java/lang/Object   #9 = Class              #47            // com/study/ILoading  #10 = Utf8               STATE_NON_FINAL  #11 = Utf8               I  #12 = Utf8               STATIC_BASIC  #13 = Utf8               ConstantValue  #14 = Integer            10  #15 = Utf8               STATIC_STR  #16 = Utf8               Ljava/lang/String;  #17 = String             #48            // 123  #18 = Utf8               mLoading  #19 = Utf8               mRef  #20 = Utf8                 #21 = Utf8               (ILjava/lang/String;)V  #22 = Utf8               Code  #23 = Utf8               LineNumberTable  #24 = Utf8               LocalVariableTable  #25 = Utf8               this  #26 = Utf8               Lcom/study/ClassLoadMechanism;  #27 = Utf8               loading  #28 = Utf8               ref  #29 = Utf8               (Lcom/study/JavaModel;)V  #30 = Utf8               data  #31 = Utf8               Lcom/study/JavaModel;  #32 = Utf8               (Ljava/lang/Object;)V  #33 = Utf8                 #34 = Utf8               ()V  #35 = Utf8               Signature  #36 = Utf8               Ljava/lang/Object;Lcom/study/ILoading;  #37 = Utf8               SourceFile  #38 = Utf8               ClassLoadMechanism.java  #39 = NameAndType        #20:#34        // "":()V  #40 = NameAndType        #18:#11        // mLoading:I  #41 = NameAndType        #19:#16        // mRef:Ljava/lang/String;  #42 = Utf8               com/study/JavaModel  #43 = NameAndType        #27:#29        // loading:(Lcom/study/JavaModel;)V  #44 = NameAndType        #10:#11        // STATE_NON_FINAL:I  #45 = Utf8               com/study/ClassLoadMechanism  #46 = Utf8               java/lang/Object  #47 = Utf8               com/study/ILoading  #48 = Utf8               123{  // 源码构造函数  ClassLoadMechanism(int loading, String ref) {        this.mLoading = loading;        this.mRef = ref;   }  // 对应的字节码  com.study.ClassLoadMechanism(int, java.lang.String);    descriptor: (ILjava/lang/String;)V // 函数签名    flags:    Code: // 代码      stack=2, locals=3, args_size=3         0: aload_0         1: invokespecial #1                  // Method java/lang/Object."":()V         4: aload_0                           // 从局部变量表里加载this到操作数栈         5: iload_1                           // 从局部变量表里加载loading变量到操作数栈         6: putfield      #2                   // Field mLoading:I  给变量赋值         9: aload_0                         // 从局部变量表里加载this到操作数栈        10: aload_2                        // 从局部变量表里加载ref变量到操作数栈        11: putfield      #3                  // Field mRef:Ljava/lang/String;        14: return      LineNumberTable:        line 12: 0        line 13: 4        line 14: 9        line 15: 14      // 局部变量表 构造函数三个参数 (this, loading, ref)      LocalVariableTable:        Start  Length  Slot  Name   Signature            0      15     0  this   Lcom/study/ClassLoadMechanism;            0      15     1 loading   I            0      15     2   ref   Ljava/lang/String; // 源代码  public void loading(JavaModel data) {  } // 字节码Part#1  public void loading(com.study.JavaModel);    descriptor: (Lcom/study/JavaModel;)V    flags: ACC_PUBLIC    Code:      stack=0, locals=2, args_size=2         0: return      LineNumberTable:        line 20: 0      LocalVariableTable:        Start  Length  Slot  Name   Signature            0       1     0  this   Lcom/study/ClassLoadMechanism;            0       1     1  data   Lcom/study/JavaModel;  // 字节码Part#2 内部生成的桥接方法用来做隐式泛型类型转化  // 该接口给泛型接口函数签名一致  public void loading(java.lang.Object);    descriptor: (Ljava/lang/Object;)V    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC    Code:      stack=2, locals=2, args_size=2         0: aload_0         1: aload_1         2: checkcast     #4                  // class com/study/JavaModel         5: invokevirtual #5                  // Method loading:(Lcom/study/JavaModel;)V         // 再这里再调用泛型对应的真实类型的函数 其中有checkcast类型转化         8: return      LineNumberTable:        line 3: 0      LocalVariableTable:        Start  Length  Slot  Name   Signature            0       9     0  this   Lcom/study/ClassLoadMechanism;  // 默认会生成静态构造函数  初始化静态非final变量  static {};    descriptor: ()V    flags: ACC_STATIC    Code:      stack=1, locals=0, args_size=0         0: bipush        10         2: putstatic     #6                  // Field STATE_NON_FINAL:I         5: return      LineNumberTable:        line 5: 0}// 泛型信息Signature: #36                          // Ljava/lang/Object;Lcom/study/ILoading;SourceFile: "ClassLoadMechanism.java"Classfile /build/intermediates/javac/debug/classes/com/study/ClassLoadMechanism.class  Last modified Feb 23, 2021; size 1001 bytes  MD5 checksum e44b0bf0907325dd4d888adf2ff1f73e  Compiled from "ClassLoadMechanism.java"public class com.study.ClassLoadMechanism extends java.lang.Object implements com.study.ILoading  minor version: 0  major version: 52  flags: ACC_PUBLIC, ACC_SUPERConstant pool:   #1 = Methodref          #8.#39         // java/lang/Object."":()V   #2 = Fieldref           #7.#40         // com/study/ClassLoadMechanism.mLoading:I   #3 = Fieldref           #7.#41         // com/study/ClassLoadMechanism.mRef:Ljava/lang/String;   #4 = Class              #42            // com/study/JavaModel   #5 = Methodref          #7.#43         // com/study/ClassLoadMechanism.loading:(Lcom/study/JavaModel;)V   #6 = Fieldref           #7.#44         // com/study/ClassLoadMechanism.STATE_NON_FINAL:I   #7 = Class              #45            // com/study/ClassLoadMechanism   #8 = Class              #46            // java/lang/Object   #9 = Class              #47            // com/study/ILoading  #10 = Utf8               STATE_NON_FINAL  #11 = Utf8               I  #12 = Utf8               STATIC_BASIC  #13 = Utf8               ConstantValue  #14 = Integer            10  #15 = Utf8               STATIC_STR  #16 = Utf8               Ljava/lang/String;  #17 = String             #48            // 123  #18 = Utf8               mLoading  #19 = Utf8               mRef  #20 = Utf8                 #21 = Utf8               (ILjava/lang/String;)V  #22 = Utf8               Code  #23 = Utf8               LineNumberTable  #24 = Utf8               LocalVariableTable  #25 = Utf8               this  #26 = Utf8               Lcom/study/ClassLoadMechanism;  #27 = Utf8               loading  #28 = Utf8               ref  #29 = Utf8               (Lcom/study/JavaModel;)V  #30 = Utf8               data  #31 = Utf8               Lcom/study/JavaModel;  #32 = Utf8               (Ljava/lang/Object;)V  #33 = Utf8                 #34 = Utf8               ()V  #35 = Utf8               Signature  #36 = Utf8               Ljava/lang/Object;Lcom/study/ILoading;  #37 = Utf8               SourceFile  #38 = Utf8               ClassLoadMechanism.java  #39 = NameAndType        #20:#34        // "":()V  #40 = NameAndType        #18:#11        // mLoading:I  #41 = NameAndType        #19:#16        // mRef:Ljava/lang/String;  #42 = Utf8               com/study/JavaModel  #43 = NameAndType        #27:#29        // loading:(Lcom/study/JavaModel;)V  #44 = NameAndType        #10:#11        // STATE_NON_FINAL:I  #45 = Utf8               com/study/ClassLoadMechanism  #46 = Utf8               java/lang/Object  #47 = Utf8               com/study/ILoading  #48 = Utf8               123{  private static int STATE_NON_FINAL;    descriptor: I    flags: ACC_PRIVATE, ACC_STATIC  private static final int STATIC_BASIC = 10;    descriptor: I    flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL    ConstantValue: int 10  private static final java.lang.String STATIC_STR = "123";    descriptor: Ljava/lang/String;    flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL    ConstantValue: String 123  private final int mLoading;    descriptor: I    flags: ACC_PRIVATE, ACC_FINAL  private final java.lang.String mRef;    descriptor: Ljava/lang/String;    flags: ACC_PRIVATE, ACC_FINAL  com.study.ClassLoadMechanism(int, java.lang.String);    descriptor: (ILjava/lang/String;)V    flags:    Code:      stack=2, locals=3, args_size=3         0: aload_0         1: invokespecial #1                  // Method java/lang/Object."":()V         4: aload_0         5: iload_1         6: putfield      #2                  // Field mLoading:I         9: aload_0        10: aload_2        11: putfield      #3                  // Field mRef:Ljava/lang/String;        14: return      LineNumberTable:        line 12: 0        line 13: 4        line 14: 9        line 15: 14      LocalVariableTable:        Start  Length  Slot  Name   Signature            0      15     0  this   Lcom/study/ClassLoadMechanism;            0      15     1 loading   I            0      15     2   ref   Ljava/lang/String;  public void loading(com.study.JavaModel);    descriptor: (Lcom/study/JavaModel;)V    flags: ACC_PUBLIC    Code:      stack=0, locals=2, args_size=2         0: return      LineNumberTable:        line 20: 0      LocalVariableTable:        Start  Length  Slot  Name   Signature            0       1     0  this   Lcom/study/ClassLoadMechanism;            0       1     1  data   Lcom/study/JavaModel;  public void loading(java.lang.Object);    descriptor: (Ljava/lang/Object;)V    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC    Code:      stack=2, locals=2, args_size=2         0: aload_0         1: aload_1         2: checkcast     #4                  // class com/study/JavaModel         5: invokevirtual #5                  // Method loading:(Lcom/study/JavaModel;)V         8: return      LineNumberTable:        line 3: 0      LocalVariableTable:        Start  Length  Slot  Name   Signature            0       9     0  this   Lcom/study/ClassLoadMechanism;  static {};    descriptor: ()V    flags: ACC_STATIC    Code:      stack=1, locals=0, args_size=0         0: bipush        10         2: putstatic     #6                  // Field STATE_NON_FINAL:I         5: return      LineNumberTable:        line 5: 0}Signature: #36                          // Ljava/lang/Object;Lcom/study/ILoading;SourceFile: "ClassLoadMechanism.java"3. 虚拟机如何去描述Java类?5 {6 w8 V& J3 R

    4 D9 Z3 N0 _0 I* A) z( {- k8 E  t0 ^
      h# n1 F1 k$ V+ k4 XJava吧 收集整理 java论坛 www.java8.com
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表