Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java编译器API中将Trees.isAccessible()用于基本数据类型/如何将TypeMirror转换为DeclaredType_Java_Java Compiler Api_Scopes - Fatal编程技术网

如何在Java编译器API中将Trees.isAccessible()用于基本数据类型/如何将TypeMirror转换为DeclaredType

如何在Java编译器API中将Trees.isAccessible()用于基本数据类型/如何将TypeMirror转换为DeclaredType,java,java-compiler-api,scopes,Java,Java Compiler Api,Scopes,我正在尝试使用java编译器API分析.java文件。我当前的问题是要找出给定的变量、方法或类是否在程序中的特定作用域中已知(使用作用域,我指的是Java编译器API本身定义的作用域,请参见此处:) Java编译器API()的Trees类有一个实用方法来实现这一点:isAccessible。此方法获取范围和目标节点及其声明的类型,如果目标节点在给定范围内已知,则返回true 不幸的是,我不知道如何创建这个DeclaredType对象(从现在起,我只能写类名,因为stackoverflows防止垃

我正在尝试使用java编译器API分析.java文件。我当前的问题是要找出给定的变量、方法或类是否在程序中的特定作用域中已知(使用作用域,我指的是Java编译器API本身定义的作用域,请参见此处:)

Java编译器API()的Trees类有一个实用方法来实现这一点:isAccessible。此方法获取范围和目标节点及其声明的类型,如果目标节点在给定范围内已知,则返回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”是当前程序的树实例,referenceScope是有问题的范围,nodeElement是有问题的节点,nodeType。。。嗯,这应该是所讨论节点的DeclaredType

这种直接类型转换方法适用于一种情况,即类的节点(我假设这种方法可以工作,因为节点声明自己的类型,因此其typeMirror等价于自己的类型)。但它肯定不适用于具有基元类型的变量(如标题中所述),我也不确定它是否适用于变量

有人知道吗

  • 如何对基本类型使用isAccessible方法树,或者更具体地说:如何将TypeMirror实例转换为DeclaredType实例?或
  • 如何在不使用isAccessible的情况下获取我想要的信息(如果给定范围内已知变量、类或方法)?
  • 附件:

    我对这两个问题做了进一步的研究,并想向大家介绍我发现的一些事情:

  • 有一个名为Types的实用程序类(javax.lang.model.util.Types)。可以使用标准Java编译器API类(在本例中为com.sun.source.util.JavaTask)获取类型的实例。此对象有一个方法(getDeclaredType),该方法返回给定TypeElement和某些TypeMirrors的DeclaredType实例。但是这个方法对我也不起作用,因为它抛出了一个错误,指出我使用了很少的输入参数。我假设此方法的唯一目的是为给定的原始类返回DeclaredType实例和一些类型参数(例如,要为HashMap创建DeclaredType实例,您可以将此方法与HashMap的typeElement和String的两个TypeMirror一起使用)。显然这不是我打算做的
  • 我试图通过查找变量、类或方法各自的修饰符并搜索范围树,手动确定给定范围内是否已知某个变量、类或方法,从而编写一个变通方案,但我不相信这种方法有两个主要原因:我不确定我是否在搜索算法中正确地获得了Java作用域构造的所有特例;其次,这似乎非常不必要,因为我试图重新实现(似乎)已经存在的东西,而Java编译器一直都在这样做。见鬼,即使是我的NetBeans也会一直告诉我,在我当前的作用域中是否已知给定的变量、方法或类。所以一定有办法

  • 总结一下:我现在使用了附录(2)中提到的变通方法,到目前为止,它似乎已经足够有效了。因此,如果您有相同的问题:尝试自己重新实现范围管理。