首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Log4j测井仪中的模糊字段及修饰符

问Log4j测井仪中的模糊字段及修饰符
EN

Stack Overflow用户
提问于 2016-04-14 20:08:37
回答 1查看 243关注 0票数 8

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

通过查看字节码,可以清楚地看到,该字段表示自引用的类,此时常量池还不能引用类型。然而,我发现奇怪的是这个字段的修饰符,它是0x41008,它表示一个private,synthetic字段(我可以跟着它),但是它添加了一个修饰符0x40000,我在任何地方都找不到它。

这个第19位的修饰符是从哪里来的?它表示什么?(Log4j是为Java1编译的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-14 22:00:36

javap对这个类文件非常满意:

代码语言:javascript
复制
  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:

代码语言:javascript
复制
        } else if ("Synthetic".equals(attrName)) {
            access |= Opcodes.ACC_SYNTHETIC
                    | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE;

org/objectweb/asm/ClassWriter.java:

代码语言:javascript
复制
/**
 * Pseudo access flag to distinguish between the synthetic attribute and the
 * synthetic access flag.
 */
static final int ACC_SYNTHETIC_ATTRIBUTE = 0x40000;

问题是它是怎么泄露给你的..。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36632986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档