【问题标题】:Class loading in eclipse plugineclipse插件中的类加载
【发布时间】:2013-05-03 17:09:19
【问题描述】:

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

org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javassist/bytecode/BadBytecode

我发现此类错误是由于类加载器不“知道”添加到 JavaProject BuildPath 的外部库:JavaProject 的类使用这些库的类

在前面的例子中使用了库 javassist 的 BadBytecode 类 在这个JavaProject类的声明中

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

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

【问题讨论】:

    标签: java eclipse plugins reflection classloader


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你必须在选中的java项目中获取类加载器,然后使用类加载器来加载类。 Java 项目的类加载器与 eclipse 插件中的类加载器不同。 请参阅以下链接中的详细代码: https://sdqweb.ipd.kit.edu/wiki/JDT_Tutorial:_Class_Loading_in_a_running_plugin

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 2010-09-27
        相关资源
        最近更新 更多