我可以在Java中使用符合我的自定义的外国类吗? 接口并将其“转换”到该接口?
示例:
public class YouCanNotChangeMe_IAmNotYours{
public void doSomethingSpecial();
}
public interface MyInterface{
void doSomethingSpecial();
}
我可以在我的界面所在的地方使用那个外国人吗?
为什么我需要这个?
我想在运行时动态重新加载某些JAR的较新版本, as I've mentioned here
现在,服务器知道所有接口(知道以前的版本) JAR在编译时)。问题是,从加载类后 该JAR在运行时的较新版本,这些“新”类充当 如果他们不“知道”编译时已知的接口。
示例:一个名为 HelloClass 的旧类(在编译时已知)确实实现了 接口 HelloInterface ,但是新加载的类 HelloClass 不实现相同的界面!
答案 0 :(得分:1)
你可以扩展外来类(假设它是非final的)并使该类实现接口。
或者你可以围绕该界面实现自己的包装器:
public class ForeignClassWrapper implements MyInterface {
private final YouCanNotChangeMe_IAmNotYours delegate;
public ForeignClassWrapper(YouCanNotChangeMe_IAmNotYours delegate) {
this.delegate = delegate;
}
public void doSomethingSpecial() {
delegate.doSomethingSpecial();
}
}
更一般地说,您可以使用反射获得相同的效果(因此您不需要在包装类中对YouCanNotChangeMe_IAmNotYours
进行硬编码。)
答案 1 :(得分:0)
除非我弄错了,否则您需要重新考虑容器和ClassLoader设计。您正在尝试实现与普通servlet容器支持的功能相同的功能,因此可能需要将其视为灵感。
至于具体问题: 类型的实例 x 只是类 A 的实例,如果 x.getClass( ).getClassLoader()== A.class.getClassLoader()。因此,即使两个或多个对象可能属于 A 类,如果Java具有不同的ClassLoader,它们也会将它们视为不同的类型。
听起来您尝试投射的界面应该位于公共基础(或系统)ClassLoader中。