classnotfound异常反射

时间:2017-01-03 12:51:17

标签: eclipse-plugin eclipse-rcp

我已经为Java反射创建了一个Utility类。如果方法名称被传递,我的意图是什么 作为参数,它应该返回Collecton的值。实用程序类是在Eclipse Plugin项目(com.abc.utility)中创建的。 我将此实用程序类添加到另一个插件项目(com.abc.dao)。现在,当我调用此实用程序方法时,我收到ClassNotFoundException。 我理解了这个问题。我不想将依赖项添加到com.abc.utility项目的类中。宁 com.abc.utility插件项目应该作为依赖项添加到其他项目中。

我不知道如何重新解决。你能帮我解决这个问题吗?

@SuppressWarnings({ "unchecked", "rawtypes" })
    public <K>Collection<K> getCollection(T t, String methodName) {

        Method[] methods =t.getClass().getMethods();        

        for (Method method : methods) {         
            String name = method.getName();
            if (name.equals(methodName)) {
                String name2 = method.getReturnType().getName();
                Object newInstance = null;
                try {
                    newInstance = Class.forName(name2).newInstance();
                } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e1) {
                    e1.printStackTrace();
                }
                if (newInstance instanceof Collection) {
                    try {
                        return (Collection)method.invoke(t, null);
                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }

            }
        }

        return Collections.emptyList();
    }

1 个答案:

答案 0 :(得分:0)

你不能这样做。每个Eclipse插件都有一个单独的类路径,因此在插件中com.abc.utility Class.forName只适用于插件中的类或它的依赖项。其他类不在插件的类路径中,也无法找到它们。

您可以在其他插件中加载类,但前提是您知道包含该类的插件。为此,您可以使用:

Bundle bundle = ... bundle for the plugin containing the class

Class<?> theClass = bundle.loadClass("class name");

您可以使用以下命令从插件ID获取Bundle

Bundle bundle = Platform.getBundle("plugin id");