无法覆盖所有接口方法

时间:2016-06-27 16:53:26

标签: java jar

我已经连续三天在这里了,我找不到答案。需要一些有经验的人的建议。 :)

我们让程序员多年前离开我们。我们所拥有的只是.jar文件而没有原始资源。因此,为了对此.jar进行微调,我运行了一个反编译器并插入了我们自己的类文件,并修改了.jar中现有的一个类文件来调用它。这是在应用程序中的某个点插入我们需要的代码的简单方法(这个东西很大,因此反编译整个项目有点令人生畏且容易出错)。这一切在过去几年都很好。然而,上周我认为我们需要一个线程来提高效率......

代码一旦完成线程初始化就完全没有错误。我进一步缩小到实际的Runnable初始化,然后向下看似我尝试的任何接口。由于我在现有的jar文件中运行,因此除了写入我自己制作的日志文件之外,我没有调试访问权限。所以我可以在Runnable初始化之前写一个日志行,然后什么都没有。

所以调用设置一个可运行的变量:

Runnable r;

看起来很好,所以找到参考没有问题。但是,只要我尝试覆盖该方法:

r = new Runnable(){
    public void run(){

    }
};

永远不会到达此行下方的日志文件的输出。所以。无论出于何种原因,我都认为它可能是一个访问修饰符问题。所以我在运行时检查了它:

Method[] methods = Runnable.class.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
    writeToLog("public method: " + methods[i]);
}

我最终得到了:

“public method:public abstract void java.lang.Runnable.run()”

我认为哪个...

任何人都可以向我提供任何有关为什么会失败的见解?我假设这是一些未经检查的异常,否则我的try / catch应该输出到我的日志。如果我有一些能力来调试它。我甚至尝试过远程调试器选项,但它似乎没有输出任何东西。也许在这个jar中有一些内部错误处理覆盖了所有内容。也许我一直在研究这个问题,以至于我完全走错了路来解决这个问题!

我的所有代码都已准备就绪,我只需要将其粘贴在血腥的Runnable中!太令人沮丧:)提前谢谢!

tldr:我正在将一个类文件插入到现有的jar中,因为我没有源访问权限。所有代码都运行正常,但是不能覆盖任何接口方法(特别是Runnable),我无法弄清楚为什么因为我没有调试访问权

更新感谢@mikibrv提供的IntelliJ IDE建议。我现在有一条错误消息:

java.lang.NoClassDefFoundError

当我能清楚地找到它及其公共方法时,为什么不会定义该类的任何想法?

1 个答案:

答案 0 :(得分:3)

如果您使用的是Maven,则可以尝试在本地maven存储库中安装JAR,并将其作为项目的依赖项添加。然后,您将能够在新项目中实际使用这些类并扩展它们。

像这样:https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

此外,像IntelliJ这样的IDE将能够反编译JAR以方便您访问。甚至调试它

另一个想法是采用每个类,因为您反编译并使用较新版本的Java再次重新编译它们。很可能这个jar是用旧版本的Java编译的。