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

Raf*_*ter 8 java bytecode

查看类文件时,org.apache.log4j.Logger它定义了一个Class带有name 的类型的合成字段class$org$apache$log4j$Logger.

从查看字节代码可以清楚地看出,该字段表示从常量池尚未引用类型的时间开始的自引用类.但是什么我也觉得奇怪的是,这一领域是的修改0x41008,其表示private,synthetic场(即我能听懂),而且还增加了一个修正0x40000,我不能找不到任何相关文档.

第19位的这个修饰符来自何处,它表达了什么?(Log4j是为Java 1编译的).

Ale*_*lev 6

javap对该类文件非常满意:

  static java.lang.Class class$org$apache$log4j$Logger;
    descriptor: Ljava/lang/Class;
    flags: ACC_STATIC
    Synthetic: true
Run Code Online (Sandbox Code Playgroud)

access_flags应该是u2,意思是2字节无符号.令人费解的是0x41008,这比大于u2.已知一些工具将access_flags存储在较大的类型中,并注入辅助位(ASM执行它,JVM执行它等)我知道您正在使用ASM进行读取,因此这可能是您正在查看的内容:

组织/ ObjectWeb联盟/ ASM/ClassReader.java:

        } else if ("Synthetic".equals(attrName)) {
            access |= Opcodes.ACC_SYNTHETIC
                    | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;
Run Code Online (Sandbox Code Playgroud)

组织/ 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;
Run Code Online (Sandbox Code Playgroud)

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

  • 它通过使用IntelliJs插件读取基于ASM而不是javap的字节代码而泄漏.应该依靠官方工具.谢谢! (2认同)