java - 在 Eclipse 插件中使用 Javassist

标签 java eclipse eclipse-plugin classloader javassist

在将应用程序部署为 Eclipse 插件时,我在使用 javassist 时遇到问题, 具体来说,代码如下:

ClassPool.getDefault().get(aClassName);

抛出:javassist.NotFoundException

如果不用作插件的一部分,代码可以正常工作。 我试图了解问题是否出在我的插件的类路径的配置中(似乎并非如此),或者与 Eclipse 在将插件项目作为 Eclipse 应用程序执行时使用的类加载器相关。

触发问题的代码是自定义 Eclipse 编辑器的一部分。因此,当用户尝试打开与编辑器关联的文档时,就会出现这种情况。 javassist 尝试加载的类是插件类的一部分。

预先感谢您提供任何线索!

最佳答案

来自 ClassPool 的文档:

Returns the default class pool. The returned object is always identical since this method is a singleton factory.

The default class pool searches the system search path, which usually includes the platform library, extension libraries, and the search path specified by the -classpath option or the CLASSPATH environment variable.

ClassPool.getDefault() 返回的 ClassPool 仅添加系统类路径。 Eclipse 插件不是由系统类加载器加载的,因此它无法看到您的插件的类。

您需要将插件的类加载器添加到类池中,以便它可以看到这些类。这可以通过以下方式完成:

ClassLoader pluginLoader = ...;
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath(new LoaderClassPath(pluginLoader));

其中 pluginLoader 是插件的类加载器。获得此信息的最简单方法可能是通过

pluginLoader = <one of your plugin's classes>.class.getClassLoader();

关于java - 在 Eclipse 插件中使用 Javassist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8329656/

相关文章:

android - 新安装时出现 Eclipse 和 android ADT 错误

java - 如何使用 jsoup 从 html 元素获取字符串形式的 html 预览结果?

java - 在eclipse中使用java访问mysql数据库

android - Eclipse : Android Device Chooser - Unknown Android 2. 3.4 设备

Android - 配置 SQLite 表以满足我的需求

java - 如何从多个动态 Web 项目创建单个 war 文件

java - 将 eclipse 插件 View 与文件扩展名关联

java - android中将执行切换到主线程

java - 使用 lucene 搜索从表中检索 SQL 日期数据类型

java - 输入/输出 Java 方法