Java 从TypeMirror获取数组的类类型

Java 从TypeMirror获取数组的类类型,java,Java,我正在做Java APT,想解析一个方法(一个ExecutableElement)。现在我需要方法的返回类型。如果是数组,我不知道如何获取类型 示例:String[]foobar() 我想获取类型字符串 从ExecutableElement实例中,我可以获得作为TypeMirror实例的返回类型(使用getReturnType())。但是如果它是一个数组,我就不能得到“实类型”(在我的示例中:String) 我试过: System.out.println("TEST: " + pReturnTy

我正在做Java APT,想解析一个方法(一个
ExecutableElement
)。现在我需要方法的返回类型。如果是数组,我不知道如何获取类型

示例:
String[]foobar()

我想获取类型
字符串

从ExecutableElement实例中,我可以获得作为TypeMirror实例的返回类型(使用
getReturnType()
)。但是如果它是一个数组,我就不能得到“实类型”(在我的示例中:
String

我试过:

System.out.println("TEST: " + pReturnType.toString());
System.out.println("TEST2: " + pReturnType.getClass().getName());
System.out.println("TEST3: " + pReturnType.getClass().getEnclosingClass());
System.out.println("TEST4: " + pReturnType.getClass().getComponentType());
System.out.println("TEST5: " + pReturnType.getKind());
这给了我:

TEST: java.lang.String[]
TEST2: com.sun.tools.javac.code.Type$ArrayType
TEST3: class com.sun.tools.javac.code.Type
TEST4: null
TEST5: ARRAY
我想要一个
java.lang.Class
的实例,代表
java.lang.String
(在我的示例中)。

这是您想要的

System.out.println(pReturnType.getClass().getSimpleName());
它的打印字符串[]

但是如果想要字符串,则必须给出索引

例如
System.out.println(pReturnType[i].getClass().getSimpleName())

方法“getComponentType”工作正常:

public String[] getValues() {
    return null;
}

@Test
public void testIt() throws Exception {
    Method m = this.getClass().getMethod("getValues");
    if (m.getReturnType().isArray()) {
        System.out.println(m.getReturnType().getComponentType());
    }
}

输出是:class java.lang.String

我知道这是一个老问题,但这里的所有答案都考虑了反射,而不是TypeMirror,它是注释处理api的一部分,而不是反射

要从typeMirror获取组件类型,必须将其强制转换为
ArrayType
并调用方法
ArrayType::getComponentType()
,即

TypeMirror pReturnType = ...
if (pReturnType.getKind() == TypeKind.ARRAY) {
    return ((ArrayType)pReturnType).getComponentType();
} else {
  //this is not an array type..
}

我这样解决了这个问题:

TypeMirror tm = fieldElement.asType();
    try {
        this.fieldType = Class.forName(tm.toString());
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("unsupported datatype: " + tm.toString());
    }

tm.toString()具有例如值:“java.lang.String”

使用
TypeVisitor
, 使用此方法接受数组类型:

 /**
 * Visits an array type.
 * @param t the type to visit
 * @param p a visitor-specified parameter
 * @return  a visitor-specified result
 */
R visitArray(ArrayType t, P p);

pReturnType是TypeMirror类型(表示数组),它不是TypeMirror.anything的数组。在您的示例中,给出了字符串[]foobar()。所以我认为这是一条线。不管怎样,它的工作方式就像fallowing
objectobj=Class.forName(您的类型).newInstance()“方法”是另一种类型,然后是“类型镜像”。我没有类型为“Method”的实例,但是类型为“TypeMirror”。JavaAPT(注释处理)似乎没有使用经典反射。它为我提供了javax.lang.model.element.element类型的实例,比如方法的ExecutableElement(不是:java.lang.reflect.Method)。