Class.forName()无法找到其他项目文件的类路径

时间:2017-08-22 14:35:37

标签: java plugins eclipse-plugin classloader

我已经创建了一个插件来获取特定.java文件的字段,因为我正在使用以下代码:

Class<?> forName = Class.forName(refPath);//refPath = "xyz.test"
Field[] declaredFields = forName.getDeclaredFields();
for (Field field : declaredFields) {
    String name = field.getName();
}

当我将此插件部署到工作区时,它完全适用于其插件项目,但不能为同一工作区的其他项目获取字段。抛出异常ClassNotFound,显然classloader无法找到其他项目文件。

有没有办法可以获得部署插件的同一工作区的其他项目(插件/非插件)的文件信息?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您需要java类容器(JAR?)在您的类路径中。

是否可以静态执行此操作,并在启动JVM时将其他存档添加到类路径中,或者您可以尝试动态添加它。

要做到这一点,您可以做以下事情:

/**
 * Adds a jar file dynamically to the current class path
 * @param jarFile
 */
private static void addToClassPath(File jarFile) {
    try {
        System.out.println("adding " + jarFile.getAbsolutePath() + " to classpath");
        URL u = jarFile.toURI().toURL();
        URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

        /* Here is a trick to call URLClassLoader.addURL whereas this method is 'protected' */
        Class sysclass = URLClassLoader.class;
        Method method = sysclass.getDeclaredMethod("addURL", sysClassLoaderParams);
        method.setAccessible(true);
        method.invoke(sysloader, new Object[] { u });
    } catch (Exception e) {
        System.out.println("Error while updating classpath: "+ e.toString());
    }
}