Java 是否可以在一个封闭源代码库中更改buggy类,该库不是为支持依赖项注入而构建的?
假设我正在使用一个封闭源代码的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
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