0

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

4

1 回答 1

0

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

在别处寻找来源

这真的是你最好的选择。如果它是一个开源项目,请寻找它的来源。你可以很容易地用谷歌搜索它,或者在搜索引擎中搜索像这样的 Maven 存储库。例如,如果您看到这里,我查找了 junit,并找到了一个名为“sources.jar”的条目。
如果它不是开源项目,而是您工作的内部项目,则可能有一个团队负责该项目。与他们联系,因为获得最初编译的原始资源确实是您的最佳选择。

但是,如果您绝对无法访问源代码怎么办。那么,你有两个选择。如果您非常熟悉 Java,我只会推荐这些选项,因为它们可能会带来比它们所能解决的更多的麻烦。

扩展类和替换方法

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

现在,如果您不小心正在做的事情,这可能是一个非常危险的想法。原因是如果您无权访问代码,那么您无法确定实现细节是如何工作的。这可能会导致错误。对原始代码缺乏可见性可能导致

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

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

反编译项目

有许多可用的 Java 反编译器将获取“.class”文件,并将其转换为“.java”文件,其中一些甚至与 eclipse 集成。但是,与获取原始来源相比,这具有严重的缺点

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

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

那你该怎么办?

组合,无需重新实现

我猜现在你有一个 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 中提供的类型,供您在程序中使用。如果您无法访问原始源代码,这是迄今为止解决您的问题的最干净的解决方案,即使您这样做,根据您想要进行的更改,它也可能是一个更好的选择。

于 2013-06-12T05:54:12.070 回答