1

我正在尝试查找调用方方法的方法签名。我需要这样做,因为我正在编写的代码被混淆并且很多方法被重载。我试图忽略来自具有签名的某个方法的调用目前我的代码看起来像这样

StackTraceElement caller = Thread.currentThread().getStackTrace()[2];
String cn = caller.getClassName();
String mn = caller.getMethodName();
if(cn == "net.minecraft.client.Minecraft" && (mn == "displayGuiScreen" || mn == "a")){ // displayGuiScreen is for non-obfuscated, a is for obfuscated. Doesn't work because 2 other methods that call it are also called a when obfuscated
    System.err.println("Skipped");
    return;
}

谁能帮我这个?谢谢

4

3 回答 3

0

首先验证您的代码在没有混淆的情况下工作。

其次,找到混淆图,它是混淆程序的输出。

第三验证您的混淆器是否更新了字符串以匹配地图中详细说明的新方法签名。奇怪的是只有类名和方法名发生了变化。

如果您没有匹配项,请查看您的混淆器以获取重写看起来像反射调用的字符串的选项,或者使用 asm 重写未获得更新的已编译类中的字符串。

于 2012-06-10T14:00:23.987 回答
0

尝试使用asm 库,我刚刚发现我认为与您相关的帖子,尝试阅读并找出示例,发布

于 2012-06-10T13:37:19.380 回答
0

您也许可以将 AspectJ 与编译时编织一起使用。如果调用者是 displayGuiScreen 方法,您可以使用around 建议什么都不做。这仅在您编译所有调用您的类的代码时才有效。编译时编织是必要的,因为您必须在混淆之前以及为您的方法的所有调用者执行此操作。你应该能够做这样的事情:

aspect IgnoreCallsFromDisplayGuiScreen {
    void around(): call(void MyClass.myMethod()) && withincode(void Minecraft.displayGuiScreen()) {
        return;
    }
}
于 2012-06-10T13:53:11.573 回答