我正在创建一个eclipse插件,我需要所选文件的Class对象,而不是IType。是否可能,最好的方法是什么?
编辑:当我考虑它时,最好的方法是像run一样添加它(比如junit,profiler或其他插件正在做)。我想他们必须能够访问Class(如果X是有问题的类),因为它们正在运行它的函数。那么如何创建具有“运行为”动作并获取实时对象的插件?
答案 0 :(得分:2)
在eclipse插件中,您将通过IAction获取所选文件 (它表示可以由最终用户触发的命令的非UI侧。操作通常与按钮,菜单项和工具栏中的项目相关联。)
从那里:
IResource selectedResource = ResourceUtils.getSelectedResource();
IResource工作区模拟文件系统文件和目录。资源正好有四种类型:文件,文件夹,项目和工作区根目录。
从类型中,您可以将其投射到 IFile ,这样您就可以访问其完整路径(getFullPath()
)
答案 1 :(得分:2)
Eclipse使用所选对象的抽象表示,无论是文件(IResource)还是Java类型(IJavaType)。由于源文件不需要编译(例如,禁用自动构建),因此对于正在编辑的代码,不一定存在.class文件或Class对象。因此,没有正确的方法从用户界面中的选择中获取“类”对象。
然而,正如昨天提到的,您可以依赖于Eclipse构建器机制将始终立即编译源文件并因此存在.class文件这一事实。要在运行时访问此.class文件,您需要为项目创建动态类加载器或启动运行时VM。我尝试过它确实有效,但这是一种非常不稳定的方法,可能导致各种难以追踪的故障。
答案 2 :(得分:0)
可以通过
检索IType“curIType”的类名curIType.getFullyQualifiedName()
这是一个简单的部分。但是你有问题,这个类不必在你的插件的类加载器中(如果它是一个用户项目的类,它很少是你的类加载器的一部分)。所以调用Class.forName(classname)不会有任何好处。
我有一个类似的情况,并且(通过第一次尝试)通过创建一个拥有自己的类加载器的自己的线程来解决它,其中包括当前类加载器的所有库以及该类型项目的所有库。这不是简短的代码也不是简单的代码,我已经重构了它。从IType中获取所有信息并且不在插件代码中的任何位置使用类更简单。