java - 是否可以更改并非为支持依赖项注入(inject)而构建的闭源库中的错误类?

标签 java classloader

假设我正在使用一个带有已知错误类的闭源 Java 库,例如 BuggyClass,并且该类在库的其余部分中进行了硬编码。所以我想象java库看起来像这样:

public class BuggyClass {
    public T buggyMethod (...) {
        // Buggy code here
    }
}

以及库中使用该类的其他几个类:

public class Example {
    private BuggyClass = new BuggyClass(); // No dependency injection possible

    public Example (/* No way to pass in my own subclass of BuggyClass*/) {
        //  ...
    }
}

等等...

是否有任何黑客或解决方法,可能使用类加载器,以便我可以子类化 BuggyClass 并获取 Example (以及库中具有 BuggyClass 硬编码在)以使用我的子类?

最佳答案

您不能创建子类,不,但您可以完全编写自己的 BuggyClass 并确保它在类路径中出现的时间早于真实类路径中的出现时间。我不认为是documented ,但默认类加载器似乎通常使用它找到的第一个匹配的类。

但显然这是一个非常糟糕的选择,因此在尝试以这种方式解决暂时解决根本问题之前,您需要用尽所有其他途径。

示例:假设我们有这个:

// The "buggy" class
package somepackage;

public class BuggyClass {
    public String someMethod() {
        return "I'm in the buggy class";
    }
}

还有这个:

// Uses the "buggy" class
package somepackage;

public class BuggyClassUser {
    public String useBuggyClass() {
        BuggyClass c = new BuggyClass();
        return c.someMethod();
    }
}

已编译,类位于 buggy.jar 中。然后我们有这个测试类:

import somepackage.*;

public class Test {
    public static final void main(String[] args) {
        BuggyClassUser u = new BuggyClassUser();
        System.out.println(u.useBuggyClass());
    }
}

如果我们运行它(*nix 格式类路径):

java -cp .:buggy.jar Test

...we see

I'm in the buggy class

But if we create a somepackage directory and put this in it:

package somepackage;

public class BuggyClass {
    public String someMethod() {
        return "I'm in the fixed class"; // <== Difference here
    }
}

...并编译它,因为我们在 jar 前面的类路径中有它,所以这个命令:

java -cp .:buggy.jar Test

...现在给我们这个:

I'm in the fixed class

再说一遍,这在很大程度上是一种解决方法,而不是解决方案。

关于java - 是否可以更改并非为支持依赖项注入(inject)而构建的闭源库中的错误类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900381/

相关文章:

java - 如何在运行时加载jar文件的所有类?

java - 如何从运行时加载的类中调用构造函数? java

java - jvm加载的类

java - 为什么我的 URLClassLoader 无法在另一个线程中工作?

java - Kotlin Array 的 toList 和 asList 有何不同?

java - 限制javapackager添加的模块

java - 使用 java DOM 替换/更改 XSD 文件中的元素类型

java - Hibernate 将默认日期时间插入非空列

java - 在 hibernate 中使用参数进行日期转换

java - 在 Web 应用程序中动态加载不在类路径中的类 - 不使用自定义类加载器