【问题标题】:Eclipse JDT: how to get data model for Java content assistEclipse JDT:如何获取 Java 内容辅助的数据模型
【发布时间】:2016-03-23 02:38:53
【问题描述】:

在Eclipse IDE上编写Java代码时,按Control + Space会弹出内容辅助窗口。
例如,System. 的内容辅助窗口将列出类 System 的所有可用字段和方法。

我需要通过代码访问内容辅助窗口的“数据模型”。
使用上面的例子,它是:给定类名System,如何检索所有可用的字段和方法?
我在 grepcode.com 上花了一些时间研究这三个类的源代码:

org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext
org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer
org.eclipse.jdt.ui.text.java.CompletionProposalCollector

看起来ICompilationUnit 实例用于提供字段和方法名称。

那我不明白如何为jre系统库或第三方库中的类生成ICompilationUnit实例?或者如果我没有以正确的方式阅读代码,那么程序是如何找到字段和方法名称的? (我不需要担心偏移量和 UI 的东西,只需要“数据模型”部分)。

【问题讨论】:

标签: java eclipse eclipse-rcp eclipse-jdt


【解决方案1】:

似乎唯一的选择是创建一个(临时)编译单元,而这又需要一个正确设置的 Java 项目。 infrastructure 是 JDT 了解使用了哪个 JRE、使用了哪些编译器设置等所必需的。

参见here如何设置Java项目,以及here如何获取编译单元。

编译单元看起来像

class Foo {
  void bar() {
    java.lang.System.
  }
}

codeComplete() 必须在调用System. 之后的偏移量。

【讨论】:

    【解决方案2】:

    您可以尝试使用java reflection API 来获取该特定类的所有成员(YourClass.getMethods()YourClass.getDeclaredMethods())。

    要根据您的输入使其动态化,您可以使用Class.forName(<fullClassName>) 获取相应的类(有关详细信息,请参阅this post)。

    您可能遇到的问题是您必须提供完整的限定类名称,因此您可能必须检查导入以找出您必须在哪个包中搜索相应的类,但这是唯一的方法这个方法。
    简单的名称并不总是唯一的,因此不适合这种搜索(解释为here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2010-11-24
      • 2011-11-02
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多