如何在Java Compiler API中使用Trees.isAccessible()获取原始数据类型/如何将TypeMirror转换为DeclaredType

时间:2012-11-28 09:59:56

标签: java java-compiler-api scopes

我正在尝试使用Java Compiler API分析.java文件。我目前的问题是找出,在程序的特定范围内是否知道给定的变量,方法或类(范围我指的是Java编译器API本身定义的范围,请参见此处:{{3} })。

Java Compiler API的Trees类(http://docs.oracle.com/javase/6/docs/jdk/api/javac/tree/com/sun/source/tree/Scope.html)有一个实用方法:isAccessible。如果目标节点在给定范围内已知,则此方法获取Scope和目标节点及其声明的类型,并返回true。

不幸的是我不知道,如何创建这个DeclaredType对象(我只能从现在开始编写类名,并且由于stackoverflows垃圾邮件防护而不再发布超链接:javax.lang.model.type.DeclaredType)。我可以向目标节点询问其类型(javax.lang.model.element.Element [asType() - method]),但它返回一个TypeMirror实例,而不是DeclaredType。

目前我使用这两行代码:

final DeclaredType nodeType = (DeclaredType) nodeTypeMirror;
isAccessible = referenceCompTree.isAccessible(referenceScope, nodeElement, nodeType);

其中“referenceCompTree”是当前程序的Trees-instance,referenceScope是有问题的范围,nodeElement是有问题的节点和nodeType ......好吧,应该是相关节点的DeclaredType。

这种直接类型转换方法适用于一种情况,即一个类的节点(我认为这是有效的,因为一个节点声明了它自己的类型,因此它的typeMirror等同于它自己的类型)。但它确实不适用于具有基本类型的变量(如标题中所述),我不确定它是否适用于变量。

有谁知道

  1. 如何将树的isAccessible-method用于基本类型,或者更具体地说:如何将TypeMirror实例转换为DeclaredType实例?或
  2. 如何获取我想要的信息(如果在给定范围内已知变量,类或方法)而不使用isAccessible?
  3. 附录:

    我确实对这两个问题做了进一步的研究,并希望向您介绍我发现的一些事情:

    1. 有一个名为Types(javax.lang.model.util.Types)的实用程序类。可以使用标准Java编译器API类(在本例中为com.sun.source.util.JavaTask)获取类型实例。该对象有一个方法(getDeclaredType),它返回给定TypeElement和一些TypeMirrors的DeclaredType实例。但是这个方法对我来说不起作用,因为它抛出一个错误,说明我曾经使用过很少的输入参数。我想这个方法的唯一目的是为给定的原始类和一些类型参数返回一个DeclaredType实例(例如,为HashMap创建DeclaredType-实例,你将使用此方法与HashMap的typeElement和String的两个typeMirrors)。显然这不是我打算做的事。
    2. 我尝试通过查找给定范围内的变量,类或方法,通过查找其各自的修饰符并搜索范围树来尝试编写变通方法,但我不相信这种方法有两个主要原因:我不确定我是否在搜索算法中得到了Javas范围构造的所有特殊情况,其次这似乎非常不必要,因为我试图重新实现(貌似)已经存在的东西以及Java编译器一直在做的事情。天哪,即使我的NetBeans也一直告诉我,如果在我当前的范围内已知给定的变量,方法或类。所以必须有某种方式。

0 个答案:

没有答案