|
自己实现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 |
|