Java:使用符合我界面的外来类

时间:2009-04-11 07:55:59

标签: java class interface

我可以在Java中使用符合我的自定义的外国类吗? 接口并将其“转换”到该接口?

示例:

public class YouCanNotChangeMe_IAmNotYours{
    public void doSomethingSpecial();
}

public interface MyInterface{
    void doSomethingSpecial();
}

我可以在我的界面所在的地方使用那个外国人吗?

为什么我需要这个?

我想在运行时动态重新加载某些JAR的较新版本, as I've mentioned here

现在,服务器知道所有接口(知道以前的版本) JAR在编译时)。问题是,从加载类后 该JAR在运行时的较新版本,这些“新”类充当 如果他们不“知道”编译时已知的接口。

示例:一个名为 HelloClass 的旧类(在编译时已知)确实实现了 接口 HelloInterface ,但是新加载的 HelloClass 实现相同的界面!

2 个答案:

答案 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中。