Java 是否可以在一个封闭源代码库中更改buggy类,该库不是为支持依赖项注入而构建的?

Java 是否可以在一个封闭源代码库中更改buggy类,该库不是为支持依赖项注入而构建的?,java,classloader,Java,Classloader,假设我正在使用一个封闭源代码的java库和一个已知的buggy类,比如说BuggyClass,这个类在库的其余部分都是硬编码的。因此,我可以想象java库是这样的: public class BuggyClass { public T buggyMethod (...) { // Buggy code here } } 库中的其他几个类使用了该类: public class Example { private BuggyClass = new Buggy

假设我正在使用一个封闭源代码的java库和一个已知的buggy类,比如说
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
,并确保它出现在类路径中的时间早于实际路径。我不认为是这样,但是默认类加载器似乎通常使用它找到的第一个匹配类

但很明显,这是一个非常糟糕的选择,所以在试图以这种方式暂时解决潜在问题之前,您希望用尽所有其他途径

示例:假设我们有:

// 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格式类路径):

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

java -cp .:buggy.jar Test java-cp.:buggy.jar测试 …现在给了我们以下信息:

I'm in the fixed class 我在固定班 同样,这是一个非常非常好的解决办法,而不是一个解决方案

package somepackage;

public class BuggyClass {
    public String someMethod() {
        return "I'm in the fixed class"; // <== Difference here
    }
}
java -cp .:buggy.jar Test I'm in the fixed class