Помимо возможности использования методов утилиты, определенных в 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();