Log4j Logger 中的晦涩字段和修饰符
Obscure field and modifier in Log4j Logger
在 class 文件中查看 org.apache.log4j.Logger
时,它定义了一个 Class
类型的合成字段,名称为 class$org$apache$log4j$Logger
.
从字节码来看,很明显这个字段代表自引用class,从那个时候常量池还不能引用类型。然而,我发现奇怪的是该字段的修饰符 0x41008
表示 private
、synthetic
字段(我可以遵循)但添加了修饰符 0x40000
我在任何地方都找不到记录。
第19位的这个修饰符是从哪里来的,表达什么意思? (Log4j 是为 Java 1 编译的)。
javap 对 class 文件非常满意:
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,所以这可能就是你正在看的:
org/objectweb/asm/ClassReader.java:
} else if ("Synthetic".equals(attrName)) {
access |= Opcodes.ACC_SYNTHETIC
| ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
org/objectweb/asm/ClassWriter.java:
/**
* Pseudo access flag to distinguish between the synthetic attribute and the
* synthetic access flag.
*/
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;
问题是,它是如何泄露给你的...
在 class 文件中查看 org.apache.log4j.Logger
时,它定义了一个 Class
类型的合成字段,名称为 class$org$apache$log4j$Logger
.
从字节码来看,很明显这个字段代表自引用class,从那个时候常量池还不能引用类型。然而,我发现奇怪的是该字段的修饰符 0x41008
表示 private
、synthetic
字段(我可以遵循)但添加了修饰符 0x40000
我在任何地方都找不到记录。
第19位的这个修饰符是从哪里来的,表达什么意思? (Log4j 是为 Java 1 编译的)。
javap 对 class 文件非常满意:
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,所以这可能就是你正在看的:
org/objectweb/asm/ClassReader.java:
} else if ("Synthetic".equals(attrName)) {
access |= Opcodes.ACC_SYNTHETIC
| ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
org/objectweb/asm/ClassWriter.java:
/**
* Pseudo access flag to distinguish between the synthetic attribute and the
* synthetic access flag.
*/
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;
问题是,它是如何泄露给你的...