Java eclipse插件中的类加载

Java eclipse插件中的类加载,java,eclipse,plugins,reflection,classloader,Java,Eclipse,Plugins,Reflection,Classloader,我制作了一个作用于JavaProject的eclipse插件。它需要访问包含在项目类字节码中的信息,因此,我使用URLClassLoader(告诉它类在项目的“bin”文件夹中)获取对类的引用并检索我需要的所有信息。不幸的是,当我调用方法loadClass(“JavaProject中的某个类”)时,我得到了这种类型的错误: org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javassist/by

我制作了一个作用于JavaProject的eclipse插件。它需要访问包含在项目类字节码中的信息,因此,我使用URLClassLoader(告诉它类在项目的“bin”文件夹中)获取对类的引用并检索我需要的所有信息。不幸的是,当我调用方法
loadClass(“JavaProject中的某个类”)
时,我得到了这种类型的错误:

org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javassist/bytecode/BadBytecode
我发现这类错误是由于添加到JavaProject的构建路径中的外部库不被类加载器“知道”:这些库的类被JavaProject的类使用

在前一个案例中,使用了库javassist的BadBytecode类 在这个JavaProject类的语句中

public static void main(String[] args) throws NotFoundException, BadBytecode, IOException, CannotCompileException{

那么,如何使我的插件对导入java项目的外部库类可见呢?

您可以使用JavaCore.create([IProject])API访问java项目的构建路径,该API为您提供了一个IJavaProject,该项目具有遍历构建路径的API。话虽如此,你绝对不应该这样做。URLClassLoader没有重新加载现有类的概念,因此在用户编辑代码时,它永远不会看到更新版本,而且它有锁定jar文件(例如构建路径上的文件)的趋势。JDT有一个API,用于安全地遍历Java项目的类型结构,而不涉及使用类加载器。

您必须在所选Java项目中获取类加载器,然后使用类加载器来加载类。Java项目的类加载器不同于eclipse插件中的类加载器。 请参见以下链接中的详细代码: