3

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

例子:String[] foobar()

我想得到类型String

从 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.Classjava.lang.String在我的例子中)。

4

5 回答 5

5

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

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

TypeMirror pReturnType = ...
if (pReturnType.getKind() == TypeKind.ARRAY) {
    return ((ArrayType)pReturnType).getComponentType();
} else {
  //this is not an array type..
}
于 2016-03-07T21:52:52.063 回答
1

方法“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());
    }
}

输出是:类 java.lang.String

于 2013-11-05T10:04:52.463 回答
1

我解决了这样的问题:

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”

于 2016-09-26T09:25:06.887 回答
0

这是你想要的

System.out.println(pReturnType.getClass().getSimpleName());

它的打印字符串 []

但是你想要String你必须给出索引。

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

于 2013-11-05T09:55:53.880 回答
0

使用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);
于 2021-02-22T06:51:49.130 回答