Log4j Logger中的模糊字段和修改器

时间:2016-04-14 20:08:38

标签: java bytecode

在查看org.apache.log4j.Logger的类文件时,它定义了一个名为Class的{​​{1}}类型的合成字段。

通过查看字节代码,很明显该字段表示从常量池尚未引用类型的时间开始的自引用类。然而我发现奇怪的是这个字段的修饰符是class$org$apache$log4j$Logger,表示0x41008private字段(我可以遵循)但添加了修饰符synthetic我无法在任何地方找到它。

第19位的修饰符来自哪里,它表达了什么? (Log4j是为Java 1编译的)。

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;

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