如何在asm visitField方法中提取字段的访问标志

时间:2017-10-29 13:25:34

标签: java bytecode java-bytecode-asm

我尝试使用访问者API使用ASM 6实现某些类转换。 我需要知道某个字段是否具有某个访问标志。例如,字段可以是ACC_PUBLIC + ACC_STATIC。 在visitField方法中,访问标志是9.所以我怎么知道该字段是否是静态的?

由于

2 个答案:

答案 0 :(得分:1)

除了可以使用java.lang.reflect.Modifier中定义的实用程序方法(如isStatic(access))之外,您还可以使用按位和运算符({{1)来测试位的存在性}}):

&

如果要提取和解码所有位,可以使用@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // for a single flag bit, test against zero is sufficient boolean isStatic = (access & Opcodes.ACC_STATIC) != 0; // otherwise, compare with the combination itself final int PUBLICSTATIC = Opcodes.ACC_STATIC|Opcodes.ACC_PUBLIC; boolean isPublicAndStatic = (access & PUBLICSTATIC) == PUBLICSTATIC; // likewise, you can test for the absence of bits: final int ACCESS_LEVEL = Opcodes.ACC_PUBLIC|Opcodes.ACC_PROTECTED|Opcodes.ACC_PRIVATE; boolean isPackagePrivate = (access & ACCESS_LEVEL) == 0; // this allows testing for things not provided by java.lang.reflect.Modifier boolean isVarArgs = (access & Opcodes.ACC_VARARGS) != 0; … } 中的实用程序方法,例如:

java.lang.Integer

答案 1 :(得分:0)

我在类java.lang.reflect.Modifier中找到了答案,它有静态方法来查询访问修饰符,例如isStatic(access)。