在查看org.apache.log4j.Logger
的类文件时,它定义了一个名为Class
的{{1}}类型的合成字段。
通过查看字节代码,很明显该字段表示从常量池尚未引用类型的时间开始的自引用类。然而我发现奇怪的是这个字段的修饰符是class$org$apache$log4j$Logger
,表示0x41008
,private
字段(我可以遵循)但添加了修饰符synthetic
我无法在任何地方找到它。
第19位的修饰符来自哪里,它表达了什么? (Log4j是为Java 1编译的)。
答案 0 :(得分:6)
javap 对该类文件非常满意:
static java.lang.Class class$org$apache$log4j$Logger;
descriptor: Ljava/lang/Class;
flags: ACC_STATIC
Synthetic: true
access_flags应该是u2
,意思是2字节无符号。看到0x41008
大于u2
令人费解。有些工具已知将access_flags存储在较大的类型中,并注入辅助位(ASM会这样做,JVM会这样做等等)我知道你正在阅读ASM,所以这可能就是你所看到的:
<强>组织/对象式/ ASM / ClassReader.java:强>
} else if ("Synthetic".equals(attrName)) {
access |= Opcodes.ACC_SYNTHETIC
| ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
<强>组织/对象式/ ASM / ClassWriter.java:强>
/**
* Pseudo access flag to distinguish between the synthetic attribute and the
* synthetic access flag.
*/
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;
问题是,它是如何泄露给你的......