【问题标题】:Compile Java class with missing code parts编译缺少代码部分的 Java 类
【发布时间】:2012-09-17 16:16:59
【问题描述】:

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

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

【问题讨论】:

  • 我认为您已经在实施唯一合理的解决方案:)
  • 我阅读了您的回答,必须详细说明我的问题。我正在修改我没有源的 jar 文件。我反编译我想要的类,进行更改,编译为单个类并放回 jar 并开始修改。但是要编译我需要其他 jar 类。

标签: java compiler-construction


【解决方案1】:

使用接口。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      已更新根据提供的信息:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我试图避免的那件事 - 实现空定义以满足编译器。在编译期间是否从其他类中添加了一些特殊的东西,因此需要它们并且简单的方法调用是不够的?
        • @JIV:不,编译器查找方法定义的唯一位置是类本身。您可能想向我们提供更多详细信息,以便我们更好地了解您的问题。代码大纲会很有帮助。
        • @JIV 在编译期间,其他类中的任何内容都不能放入已编译的类中。代码内联可以在代码执行期间作为 JVM 代码优化的一部分执行,但不能在编译期间执行
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-17
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多