在转换为接口期间的ClassCastException

时间:2014-07-24 18:00:51

标签: osgi glassfish-4

我试图玩OSGi而且我遇到了一个问题...... 我有简单的类FirstVersionPrinter

public class FirstVersionPrinter implements VersionPrinter {
private final static String VERSION = "111";

 @Override
 public String printVersion() {
     return VERSION;
 }
}

和界面

public interface VersionPrinter {
 public String printVersion();
}

和Locator类

@Override
public String print(Integer version) {

    final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
        for (Bundle bundle : bundleContext.getBundles()) {
            BundleContext bundleContext1 = bundle.getBundleContext();
                ServiceReference sr = bundleContext1.getServiceReference(VersionPrinter.class.getName());

            ...
(1)               ((VersionPrinter) bundleContext1.getService(sr)).printVersion());
定位器I中的

尝试遍历bundle并为我的VersionPrinter执行printVersion。但是在第(1)行中我得到了ClassCastException

java.lang.ClassCastException: example.FirstVersionPrinter cannot be cast to example.VersionPrinter

有人可以澄清它为什么会发生吗? 感谢。

PS:不同包中的Locator和FirstVersionPrinter

1 个答案:

答案 0 :(得分:2)

如果多个包包含包示例,则会发生这种情况。如果两个不同的类加载器加载“相同”类,则java不会认为它是相同的。

因此,请确保理想情况下只在一个包中包含接口类并从那里导出它。所有需要该类的bundle都应该导入这个包。

如果由于某种原因您必须将示例包打包在多个包中,请确保所有这些包在其Manifest中导入和导出包。这样可以确保OSGi只选择其中一个包进行导出,并从所有其他包中导入。

顺便说一下。迭代bundle并向每个BundleContext询问服务引用的方式是不正确的。您只需要使用一个BundleContext并执行context.getServiceReferences来获取所有FirstVersionPrinter服务。