OW2 の ASM を使用して実行時にバイトコードを変更するために、単純な Java 難読化ツールを作成しようとしています。
私の目標は、すべてのクラス、フィールド、およびメソッド名の名前を変更することですが、 MethodNode がスーパークラスに存在するかどうかを簡単に検出する方法がわかりません
現在、現在のクラスのすべてのスーパークラスを再帰的にループし、同じ名前とシグネチャを持つメソッドが存在するかどうかを確認しています
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);
}
これはやり過ぎのように思えるので、これを達成するためのよりクリーンで高速な方法はありますか?