【发布时间】:2018-01-31 03:54:07
【问题描述】:
public class A {
}
public class B {
public static void b() {
System.out.println(A.class);
}
}
类文字A.class是如何编译成B.class的字节码的?是字段参考吗?我在 Oracle/Sun 的字节码文档中找不到提及。
无论它是什么,反编译器都可以轻松重构它:
java -jar decompiler.jar B.class
拿起 JAVA_TOOL_OPTIONS: '-Dfile.encoding=UTF8'
-
// // 由 Procyon v0.5.30 反编译 //
public class B { public static void b() { System.out.println(A.class); <<< } }
【问题讨论】:
-
您将其标记为完全重复但在答案中没有提及字节码。我的问题涉及字节码。表示类的对象是常量字段、变量字段、常量字段 ref、变量字段 ref 还是其他?如果它是一个字段的引用,那么该字段属于哪个类? Class.class 显然不是,所以在我的示例中它必须是 A 类。那么A中是什么?一个变量?静态常量?
-
不确定字节码,但如果有帮助的话 - 对类对象的引用由加载该类的类加载器持有,因此您可以将其称为类加载器的(部分)变量字段。
-
我无法发布答案,因为这被标记为重复(显然我无法取消标记)。
.class运算符编译为“加载常量”指令(ldc或ldc_w),其中操作数是常量池的索引。常量池条目是一个Class_info结构(不是Fieldref_info)。该结构仅指向另一个条目:包含类型描述符的Utf8条目(package/name/ClassName形式的类型名称)。您可以自己编译一个简单的示例并通过javap -v运行它来验证这一点。 -
谢谢,很有用!不知道为什么 stackoverflow 对这个问题如此教条,这绝对不会重复所谓的重复。