Log4j Logger 中的晦涩字段和修饰符

Obscure field and modifier in Log4j Logger

在 class 文件中查看 org.apache.log4j.Logger 时,它定义了一个 Class 类型的合成字段,名称为 class$org$apache$log4j$Logger.

从字节码来看,很明显这个字段代表自引用class,从那个时候常量池还不能引用类型。然而,我发现奇怪的是该字段的修饰符 0x41008 表示 privatesynthetic 字段(我可以遵循)但添加了修饰符 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 字节无符号。看到 0x41008u2 大,令人费解。一些工具以较大的类型存储 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;

问题是,它是如何泄露给你的...