我正在创建一个 Eclipse 插件,我需要所选文件的 Class 对象,而不是 IType。有可能吗,最好的方法是什么?
编辑:当我想到它时,最好的方法是像 run as 一样添加它(就像 junit、profiler 或其他插件正在做的那样)。我想他们必须有权访问 Class (如果 X 是有问题的类),因为他们正在运行它的功能。那么如何创建具有“运行方式”操作的插件并获取活动对象?
我正在创建一个 Eclipse 插件,我需要所选文件的 Class 对象,而不是 IType。有可能吗,最好的方法是什么?
编辑:当我想到它时,最好的方法是像 run as 一样添加它(就像 junit、profiler 或其他插件正在做的那样)。我想他们必须有权访问 Class (如果 X 是有问题的类),因为他们正在运行它的功能。那么如何创建具有“运行方式”操作的插件并获取活动对象?
Eclipse 使用所选择对象的抽象表示,无论是文件(IResource)还是Java 类型(IJavaType)。由于不需要编译源文件(例如禁用自动构建),因此编辑的代码不一定要有 .class 文件或 Class 对象。因此,没有正确的方法从用户界面中的选择中获取“类”对象。
但是,正如昨天提到的,您可以依赖 Eclipse 构建器机制将始终立即编译源文件并因此存在 .class 文件这一事实。要在运行时访问此 .class 文件,您需要为项目创建动态类加载器或启动运行时 VM。我试过了,它确实有效,但这是一种非常不稳定的方法,可能会导致各种难以追踪的故障。
IType "curIType" 的类名可以通过
curIType.getFullyQualifiedName()
这是简单的部分。但是你有一个问题,这个类不必在你的插件的类加载器中(如果它是一个用户项目的类,它很少是你的类加载器的一部分)。所以调用 Class.forName(classname) 不会有任何好处。
我有一个类似的案例,并且(在第一次尝试中)通过使用自己的类加载器创建一个自己的线程来解决它,其中包括当前类加载器的所有库和该类型项目的所有库。这既不是一个简短的代码也不是一个简单的代码,我已经对其进行了重构。从 IType 中获取所有信息并且不在插件代码中的任何地方使用类要简单得多。