gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:31:39 25 4
gpt4 key购买 nike

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

谢谢

最佳答案

除了可以使用 java.lang.reflect.Modifier 中定义的实用方法之外,例如 isStatic(access) ,您始终可以使用按位与运算符(&)来测试位是否存在:

@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中的实用方法,例如:

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();

关于java - 如何在asm访问字段方法中提取字段的访问标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com