gpt4 book ai didi

java - 是否可以更轻松地检查方法是否被父类(super class)覆盖?

转载 作者:行者123 更新时间:2023-12-01 04:56:40 24 4
gpt4 key购买 nike

我正在尝试创建简单的 Java 混淆器,以便使用 OW2 的 ASM 创建它以在运行时修改字节码。

我的目标是重命名每个类、字段和方法名称,但我不知道如何轻松检测 MethodNode 是否存在于父类(super class)中

我目前正在递归循环当前类中的每个父类(super class),并查看是否存在具有相同名称和签名的方法

private boolean isSuperMethod(MethodNode method, ClassNode node) {
if(node.superName == null)
return false;
boolean exists = false;
ClassNode cn = null;
try {
ClassReader cr = new ClassReader(node.superName);
cn = new ClassNode();
cr.accept(cn, 0);
} catch (IOException e) {
e.printStackTrace();
}
for(MethodNode superMethod: (List<MethodNode>)cn.methods) {
boolean sameSignature = (superMethod.signature == null && method.signature == null) || superMethod.signature.equals(method.signature);
if(superMethod.name.equals(method.name) && sameSignature) {
System.out.println(superMethod.name + " exists in parent class(" + cn.name + ")");
exists = true;
break;
}
}
return exists || isSuperMethod(method, cn);
}

是否有更干净或更快的方法来实现这一目标,因为这看起来有点矫枉过正?

最佳答案

当 JVM 加载一个类时,它会将这些类的方法组织在所谓的方法表中。该方法表通过名称和描述符来标识每个方法。因此,您所做的就是确定重写方法的唯一方法。 (检查 Overridden 注释不是一个解决方案,因为此注释不会保留在编译的类中,它仅充当 Java 编译器的指令。)

当您考虑类 B 扩展 A 时,这一点变得更加明显,其中类 A 在编译 B 后发生更改。如果B重写了A的方法,则在重新编译后不一定仍然如此。

但是有一件事,方法的签名与被重写的方法无关。您应该检查描述符

关于java - 是否可以更轻松地检查方法是否被父类(super class)覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002035/

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