假设我正在使用一个带有已知错误类的闭源 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/