编译缺少代码部分的 Java 类

问题描述 投票:0回答:5

我正在寻找一些关于如何编译缺少其他一些代码片段(方法调用)的 Java 代码的想法。我完全清楚,如果找不到所有依赖项,javac将不允许您编译Java文件。但也许有一些方法可以绕过它,比如强制编译。
我的字节码知识不太好,但我认为某些方法调用只是带有参数的类和方法名称的完整包定义。因此,如果编译器只是将这些数据放入类文件中,并假设在运行过程中依赖项将可用(如果不是简单的 NoSuchMethodExp)。

到目前为止,我发现的唯一解决方法是使用空方法创建空的缺失类文件来“欺骗”编译器。工作完美,但应该有更简单的方法:)
有什么想法吗?

java
5个回答
4
投票

使用接口。

创建具有您需要的方法的接口。在运行时,注入(Spring、Guice等)或生成(cglib ...)实现接口的类。


1
投票

如果您正在修改 jar,则可以将不修改的类文件提取到另一个目录并将其包含在类路径中。这样编译器就可以使用它们。


1
投票

运气不好!也许您所能做的就是为代码的缺失部分创建模拟对象,只是为了编译您的代码(空方法,以便编译器可以找到它)。
另一个问题 - 如果你错过了一些课程,你将如何执行该代码?

更新根据提供的信息:

嗯,还有另一个选项可以修改jar中的类,您可以使用AOP,并完成阅读AspectJ - 实际上对我来说这是最简单的选项(通常您需要花时间模拟对象,编写空方法,所以我会贡献出那段时间来学习新技术,这会对你有很多帮助;)
顺便说一句,如果您使用 Eclipse,实现它的最简单方法是:

  1. 安装AJDT
  2. 创建方面项目
  3. 创建修改代码的方面(取决于您需要更改的内容)
  4. 添加要修改的jar文件
  5. 立即获取修改后的代码 另一个已经打包好的jar文件

听起来很神奇:)
在这种情况下,您不需要类路径中的任何依赖项,除了您添加的新代码所需的库!


0
投票

方法不是依赖项。它们是类定义的一部分。 java 运行时查找方法定义的唯一位置是在编译时编译的类 def 及其父类中。如果您的问题是超级课程不完整,我认为我无法帮助您。

如果没有,您可以将其中一些方法定义为抽象方法,然后让子类实现它们。


0
投票

缺少什么样的代码?通常,如果您引用编译器找不到的库,就会发生这种情况。也许您只需要扩展编译器正在搜索类的类路径。

如果您确实引用了尚不可用的代码,您至少需要实现您引用的那些方法。但这听起来很奇怪......也许你可以把事情弄清楚。

© www.soinside.com 2019 - 2024. All rights reserved.