为什么我无法在运行时访问我的 Eclipse 插件的 类?

Why i cant access the classes of my Eclipse plugin at Runtime?

我正在开发一个 Eclipse 插件,com.simple.plugin,具有以下结构:

问题是在运行期间我无法访问我自己的插件 的类。 例如,如果我在 SampleHandler.java 中执行以下代码:

Class cls = Class.forName("com.simple.handlers.SampleHandler");
Object obj = cls.newInstance();

我收到错误:

java.lang.ClassNotFoundException: com.simple.handlers.SampleHandler cannot be found by com.simple.plugin_1.0.0.qualifier*

我的类路径清单运行时选项有插件的根目录,所以我不知道出了什么问题!

每个 Eclipse 插件都使用自己的 class 加载器运行。因此,您将无法从其他包中动态加载任何 class。

针对此类问题,Eclipse osgi 中有一个Buddy 系统。您必须在 manifest.mf 文件中更改您的父项目伙伴政策:

Eclipse-BuddyPolicy: Registered

要使来自其他插件项目的 classes 对您的父项目可用,请将其添加到您的 manifest.mf 文件中。

Eclipse-RegisterBuddy: {NAME OF THE PARENT PLUGIN}

例如:

Eclipse-RegisterBuddy: de.myname.myplugin

现在您可以从这两个插件加载 class。

另见此处:

https://wiki.eclipse.org/Context_Class_Loader_Enhancements

您的 SampleHander class 在 com.simple.plugin.handlers 包中 而不是 com.simple.handlers 包中。所以正确的代码是:

Class<?> cls = Class.forName("com.simple.plugin.handlers.SampleHandler");

您必须始终指定所需 class 的完整 程序包 名称。