假设我正在使用一个已知错误类的封闭源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
硬编码的所有其他类)使用我的子类?
答案 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
同样,这是非常非常的解决方法,而不是解决方案。