在Java的注释处理器中发现方法调用的类

在Java的注释处理器中发现方法调用的类,第1张

在Java的注释处理器中发现方法调用的类

这里有几个问题。您可能对知道方法调用接收者的Java类型感兴趣,或者只是知道方法上的类被调用。Java信息更具信息性,因为它也为您提供了通用类型,例如,

List<String>

而Elements仅向您提供类,例如
List<E>

获取元素

要获取调用该方法的类的Element,可以执行以下 *** 作:

  MethodInvocationTree node = ...;  Element method =        TreeInfo.symbol((JCTree)node.getMethodSelect());  TypeElement invokedClass = (TypeElement)method.getEnclosingElement();

角落案例:

1. invokedClass可能是接收者类型的超类。因此,继续运行摘要

new ArrayList<String>.equals(null)
将返回
AbstractList
而不是
ArrayList
,因为equals()是在
AbstractList
not中实现的
ArrayList

2.例如

new int[].clone()
,在处理数组调用时,您将获得
TypeElement
class
Array

获取实际类型

为了获得类型,没有直接的方法来确定它是什么接收器类型。在内部类中处理方法调用存在一些复杂性,在内部类中没有显式指定接收者(例如与

OuterClass.this.toString()
)。这是一个示例实现:

  MethodInvocationTree node = ...;  TypeMirror receiver;  if (methodSel.getKind() == Tree.Kind.MEMBER_SELECT) {    expressionTree receiver = ((MemberSelectTree)methodSel).getexpression();    receiverType = ((JCTree)receiver).type;  } else if (methodSel.getKind() == Tree.Kind.IDENTIFIER) {    // need to resolve implicit this, which is described in    //  JLS3 15.12.1 and 15.9.2    // A bit too much work that I don't want to work on now    // Look at source pre of    //   Attr.visitApply(JCMethodInvocation)    //   resolveImplicitThis(DiagnosticPosition, Env, Type)  } else    throw new AssertionError("Unexpected type: " + methodSel.getKind());

注意:

receiver
类型必须是
TypeMirror
没有
DeclaredType
遗憾的。拨打电话时
newint[5].clone()
receiver
将是一个
ArrayType
int[]
,这比以前的方法更多的信息。

让它运行

前面两种方法都要求编译器解析类的类型信息。在通常情况下,编译器仅解析方法声明的类型,而不解析主体。因此,前面描述的方法将

null
改为返回。

要使编译器解析类型信息,可以执行以下其中一种方法:

1.使用

AbstractTypeProcessor
刚刚添加到JDK的编译器存储库中的类。7.检查有关JSR
308
及其编译器的工作。尽管该工作主要是在带注释的类型上,但可能对您有用。编译器允许您以与Java
5向后兼容的方式使用提供的类。

这种方法使您可以编写与当前处理器一样被调用的处理器。

2.使用

JavacTask
代替并致电
JavacTask.analyze()
。查看此javac测试的主要方法,以了解如何在类上调用访问者。

这种方法使您的处理器看起来更像是一种分析工具,而不是编译器的插件,因为您需要直接调用它而不是使其成为常规过程。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5489967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存