当查看org.apache.log4j.Logger的类文件时,它定义了一个名为class$org$apache$log4j$Logger的类型为Class的合成字段。
通过查看字节码,可以清楚地看到,该字段表示自引用的类,此时常量池还不能引用类型。然而,我发现奇怪的是这个字段的修饰符,它是0x41008,它表示一个private,synthetic字段(我可以跟着它),但是它添加了一个修饰符0x40000,我在任何地方都找不到它。
这个第19位的修饰符是从哪里来的?它表示什么?(Log4j是为Java1编译的)。
发布于 2016-04-14 22:00:36
javap对这个类文件非常满意:
static java.lang.Class class$org$apache$log4j$Logger;
descriptor: Ljava/lang/Class;
flags: ACC_STATIC
Synthetic: trueaccess_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;问题是它是怎么泄露给你的..。
https://stackoverflow.com/questions/36632986
复制相似问题