как извлечь флаги доступа поля в asm visitField метод

Я пытаюсь реализовать некоторые преобразования класса с помощью ASM 6 с помощью API-интерфейса посетителя. Мне нужно знать, имеет ли поле определенный флаг доступа. например, поле может быть ACC_PUBLIC + ACC_STATIC. в методе visitField флаг доступа равен 9. Так как я могу узнать, является ли поле статическим?

благодаря

java,bytecode,java-bytecode-asm,

0

Ответов: 2


1

Помимо возможности использования методов утилиты, определенных в java.lang.reflect.Modifier, например isStatic(access), вы всегда можете проверить наличие бит с помощью побитового и operator ( &):

@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;

    a€¦
}

Если вы хотите извлечь и декодировать все биты, вы можете использовать методы утилиты java.lang.Integer, например:

StringJoiner j = new StringJoiner(" ").setEmptyValue("(package-private)");
for(int remaining = access, bit; remaining != 0; remaining -= bit) {
    bit = Integer.lowestOneBit(remaining);
    switch(bit)
    {
        case Opcodes.ACC_PUBLIC:       j.add("public"); break;
        case Opcodes.ACC_PRIVATE:      j.add("private"); break;
        case Opcodes.ACC_PROTECTED:    j.add("protected"); break;
        case Opcodes.ACC_STATIC:       j.add("static"); break;
        case Opcodes.ACC_FINAL:        j.add("final"); break;
        case Opcodes.ACC_SYNCHRONIZED: j.add("synchronzied"); break;
        case Opcodes.ACC_BRIDGE:       j.add("(bridge)"); break;
        case Opcodes.ACC_VARARGS:      j.add("(varargs)"); break;
        case Opcodes.ACC_NATIVE:       j.add("native"); break;
        case Opcodes.ACC_ABSTRACT:     j.add("abstract"); break;
        case Opcodes.ACC_STRICT:       j.add("strictfp"); break;
        case Opcodes.ACC_SYNTHETIC:    j.add("synthetic"); break;
    }
}
String decoded = j.toString();

0

Я нашел ответ в классе java.lang.reflect.Modifier, который имеет статический метод для запроса модификаторов доступа, например isStatic (access).

Java, байт-код, Java-байткод-ASM,
Похожие вопросы