是否有可能在未构建为支持依赖注入的封闭源库中更改错误类?

时间:2014-04-06 21:41:10

标签: 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*/) {
        //  ...
    }
}

等...

是否有任何hack或变通方法,可能使用类加载器,以便我可以继承BuggyClass并获取Example(以及库中具有BuggyClass硬编码的所有其他类)使用我的子类?

1 个答案:

答案 0 :(得分:2)

你不能做一个子类,不,但你可以完全编写自己的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

......我们看到了

I'm in the buggy class

但是如果我们创建一个somepackage目录并将其放入其中:

package somepackage;

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

...并编译它,因为我们在jar前面的classpath中有这个命令:

java -cp .:buggy.jar Test

... 现在告诉我们:

I'm in the fixed class

同样,这是非常非常的解决方法,而不是解决方案。