我已经为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();
}
答案 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");