如何从Eclipse JDT中的类名获取IType

时间:2011-09-09 06:04:17

标签: eclipse eclipse-jdt

我正在实现JUnit New Test Suite向导的变体,而不是从当前项目中获取测试类,我需要从其他来源获取它们。他们作为完全合格的班级名字来找我。

其中一些可能尚未存在于此用户的工作空间中,更不用说在当前项目的类路径中。用户稍后需要导入这些项目,但我不想在我的向导中弄乱它。我需要将所有类添加到新套件中,无论它们是否存在。

对于已经在此项目的类路径中的那些类,我可以使用IJavaProject.findType(String fullyQualifiedName)。是否有类似的方法来获取尚未(可见)的类的IType?

我很乐意凭空构建一个IType,但是IType似乎并不喜欢构建它。

2 个答案:

答案 0 :(得分:1)

我认为不可能:Java Document Model接口是基于类路径创建的。

更糟糕的是,如果项目在用户工作区中不存在,则生成的代码将无法编译,这是不允许任意创建此类构造的另一个原因。

如果我是你,我会尝试帮助用户在类型不可用的情况下导入不存在的项目,从而避免使用Java文档模型进行处理。

答案 1 :(得分:1)

出于我的目的,创建HypotheticalTypeHypotheticalMethod可以完成工作。我附上一份概述,以防其他人需要遵循这条道路。

首先,我创建了一个HypotheticalType并让它实现了IType接口。我在我修改过的向导中的适当位置实例化了其中一个。使用Eclipse的Outline视图,我在新类的所有方法上创建了一个方法断点。这让我可以检测在执行向导期间实际调用的方法。我还修改了构造函数,以String作为我需要向导处理的类的名称。

本练习中几乎忽略了所有新方法。我发现除了以下所有方法,我可以保留默认实现(在大多数情况下返回null或返回false):

  • 构造函数
  • exists() - 无需修改
  • getAncestor(int) - 无需修改,但返回我的假设类的包可能很有用,例如:如果我的课程为java.lang.Object.class,请返回java.lang
  • getDeclaringType() - 无需修改
  • getElementName() - 已修改为返回班级名称,例如如果我的课程为java.lang.Object.class,请返回Object
  • getElementType() - 已修改为返回IJavaElement.TYPE
  • getFlags() - 尚未修改,但可能
  • getMethod(String, String[]) - 已修改为返回新的HypotheticalMethod(name)
  • getMethods() - 已修改为返回新的IMethod[] { new HypotheticalMethod("dudMethod") }

在此过程中我发现我需要能够返回HypotheticalMethod,所以我也创建了该类型,继承自IMethod,并使用相同的技术来确定哪些方法必须实施。这是在向导运行时调用的唯一方法:

  • 构造函数 - 添加String参数以引入方法的名称
  • exists() - 无需修改
  • isMainMethod() - 无需修改

这涵盖了我原始问题的解决方案。 Zoltán,我将按照您在即将进行的迭代中的建议进行操作,并尝试在所需类尚未进入此项目的类路径的情况下协助用户,以及所需类在某些项目中的情况但是在工作区里。