我有一个外部可执行jar文件,我希望用Eclipse编辑其中的java文件



但是当我将外部jar文件添加到项目中时,它不会将java文件放在src中。我该怎么办?

Jar文件通常是java类的编译形式。源代码可以包含在jar中,但很少是这样。因此,您将看到的不是预期的"。java"文件,而是"。class"文件,它们是代码的编译形式。如果您想编辑这些文件,您有几个选项

在其他地方查找源

这是你最好的选择。如果它是一个开源项目,请查找它的源代码。您可以很容易地在google上搜索,或者在搜索引擎中搜索像这样的maven存储库。例如,如果您看到这里,我查找junit,并找到一个名为"sources.jar"的条目。
如果它不是开源项目,而是您工作的内部项目,那么可能会有一个团队负责该项目。与他们联系,获取原始源代码,因为它们最初编译是你最好的选择。

但是如果你绝对不能访问源代码呢?那么,你有两个选择。我只会在您非常熟悉Java的情况下推荐这些选项,因为它们可能导致比它们能解决的更多的麻烦。

扩展类和替换方法

我假设你想这样做的原因是编辑其中一个类的一小部分行为,然后在你的项目中使用改变后的类,你可以访问其中的代码;你想要扩展的类不是final的。在这种情况下,您可以扩展类,创建一个子类,然后覆盖控制您想要更改的小功能的方法。

现在,如果你不小心你在做什么,这可能是一个相当危险的想法。原因是,如果您无法访问代码,那么您就无法确切地知道实现细节是如何工作的。这可能会导致错误。对原始代码缺乏可见性可能导致

  1. 以破坏类的原始功能的方式重写方法。这可能是因为您覆盖的方法可能正在执行某些内部操作,而这些操作对您来说可能并不明显。
  2. 原始类中可能存在非公共或非保护的字段和方法,新类可能无法访问这些字段和方法。因此,您可能无法将功能完全替换为所需的功能。

那么,如果所有这些原因都让你担心这可能不是最好的主意呢?还有一种方法可以直接替换类上的功能。

反编译项目

有许多Java反编译器可以接受"。class"文件,并将其转换为"。Java"文件,有些甚至可以与eclipse集成。然而,与获取原始源代码相比,这有严重的缺点

  1. 这可能不合法。如果你的jar是由许可提供的,那么你很可能会违反你在下载和使用该jar之前同意的许可协议。
  2. 代码将不容易阅读。您将失去源代码中最初包含的大部分良好的命名约定,使代码非常难以阅读。

反编译和重新编译很容易导致比它的价值更多的bug。它完全有可能用好,但我建议你尽可能远离它。

那么,你应该怎么做呢?

组合,不重新实现

我猜现在你有一个jar,它提供了一个类(或类列表),几乎做了你想要的,但不完全是。那么,与其更改原始源代码(您似乎无法访问它),不如使用该类,并创建一个方法来将其最终组件更改为您想要的样子。您可以通过创建一个包含所需类作为字段的类,并让它修改它来实现这一点。例如,假设你的jar有一个名为EuropeanCar的类,你喜欢它,但想要一个AmericanCar,唯一的区别是美国车返回的当前速度是"英里每小时",而不是欧洲车的"公里每小时"。但是在这个例子中,所有其他功能都是100%相同的。

你可以这样写:

public class AmericanCar
{
    //...
    private EuropeanCar internalEuropeanCar;
    //...
    public double getCurrentSpeed()
    {
        return AmericanCar.convertKilometerToMiles(this.internalEuropeanCar.getCurrentSpeed());
    }
    private static double convertKilometerToMiles(double currentSpeed)
    {
        // ...
        return CONVESION_VALUES;
    }   
    //...
}

当然,这是一个过于简化的例子,但其思想是使用组件,这些组件可以是jar中提供的类型,供您在程序中使用。如果您无法访问原始源代码,这是迄今为止最干净的解决方案,即使您可以访问原始源代码,也可能是更好的选择,具体取决于您想要进行的更改。

最新更新