我正在尝试使用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等同于它自己的类型)。但它确实不适用于具有基本类型的变量(如标题中所述),我不确定它是否适用于变量。
有谁知道
附录:
我确实对这两个问题做了进一步的研究,并希望向您介绍我发现的一些事情: