在 Java 6 注解处理器中查找方法返回类型的类型参数

Find type parameter of method return type in Java 6 annotation processor(在 Java 6 注解处理器中查找方法返回类型的类型参数)
本文介绍了在 Java 6 注解处理器中查找方法返回类型的类型参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在编写一个工具,它使用注释处理器根据带注释的类的方法的返回类型生成源代码.返回类型始终是定义类型变量 T 的接口 A 的某个子类型(接口或类).

I'm writing a tool that uses the annotation processor to generate source code depending on the return type of methods of an annotated class. The return type is always some subtype (interface or class) of an interface A that defines a type variable T.

interface A<T>{T m();};

我想找方法m()返回值类型变量T的类型参数.

I would like to find the type parameter for the method m() return value type variable T.

返回类型由注释处理器表示为 javax.lang.model.type.TypeMirror 实例.最简单的情况是直接返回A<T>.

The return type is represented by the annotation processor as a javax.lang.model.type.TypeMirror instance. The simplest case is to return A<T> directly.

@SomeAnnotation
class SomeClass{
    A<T> x();
}

找出T的处理器代码非常简单.(为了保持代码简单,我将在这里转换而不是使用访问者 API.)

The processor code to find out T is quite simple. (I'll cast instead of using the visitor API here to keep the code simple.)

DeclaredType type = (DeclaredType) typeMirror;
TypeMirror t = type.getTypeArguments().get(0);

返回类型的TypeMirror是一个javax.lang.model.type.DeclaredTypeT是第一个类型参数.结果 tTjavax.lang.model.type.TypeVariable.这同样适用于具体的返回类型 A<B>(B 是某种类型:interface B{}).t 的结果是一个代表 BDeclaredType.

The TypeMirror of the return type is a javax.lang.model.type.DeclaredType and T is the first type argument. The result t is a javax.lang.model.type.TypeVariable for T. The same works for a concrete return type A<B> (B is some type: interface B{}). The result for t is a DeclaredType representing B.

其他结果类型开始变得复杂:

Things start to get complicated with other result types:

interface Subtype<T> extends A<T>{}
interface Concrete extends A<B>{};
interface Multiple<B,T> extends A<T>{}
interface Bounds<T extends B> extends A<T>{}
interface Hierarchy extends Concrete{}

Subtype<B>          -> DeclaredType B
Subtype<T>          -> TypeVariable T
Concrete            -> DeclaredType B
Multiple<B,T>       -> TypeVariable T or DeclaredType B depeding on Multiple
Multiple<B,B>       -> TypeVariable B
<T extends B> A<T>  -> TypeVariable T with super class bound B
Bound<B>            -> DeclaredType B
Bound<C>            -> DeclaredType C (subtype of B)
Hierarchy           -> TypeVariable T

有没有办法在不镜像整个 java 类型系统的情况下为 T 找到正确的类型参数?

Is there a way to find the correct type parameter for T without mirroring the whole java type system?

推荐答案

看看http://docs.oracle.com/javase/6/docs/api/javax/lang/model/util/Types.html#asMemberOf%28javax.lang.model.type.DeclaredType,%20javax.lang.model.element.Element%29

我用它来解决这个问题,并在这个拉取请求中为 WsDoc 项目贡献了解决方案:https://github.com/versly/wsdoc/pull/7

I used it to solve this problem and contributed the solution to the WsDoc project in this pull request: https://github.com/versly/wsdoc/pull/7

我做了这样的事情:

      Type.MethodType methodType = (Type.MethodType) processingEnv.getTypeUtils().asMemberOf(declaredTypeThatExtendsSomeGenericParent, methodToGetReturnTypeForAsExecutableElement);
      TypeMirror type = methodType.getReturnType();

这篇关于在 Java 6 注解处理器中查找方法返回类型的类型参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

quot;Char cannot be dereferencedquot; error(“Char 不能被取消引用错误)
Java Switch Statement - Is quot;orquot;/quot;andquot; possible?(Java Switch 语句 - 是“或/“和可能的?)
Java Replace Character At Specific Position Of String?(Java替换字符串特定位置的字符?)
What is the type of a ternary expression with int and char operands?(具有 int 和 char 操作数的三元表达式的类型是什么?)
Read a text file and store every single character occurrence(读取文本文件并存储出现的每个字符)
Why do I need to explicitly cast char primitives on byte and short?(为什么我需要在 byte 和 short 上显式转换 char 原语?)