在java 1.6注释处理时获取实际类型而不是类型参数

时间:2011-03-08 05:57:44

标签: java apt annotation-processing

鉴于这两个类

public class MyClass extends MyAbstractClass<Cow> {
  ...
}

public abstract class MyAbstractClass<Foo_ extends AbstractFoo> {
  ...
  Key<Foo_> foo;
  ...
}

如果我在注释处理器中运行此代码,我不会得到我想要的结果。

for (VariableElement fieldElement : ElementFilter.fieldsIn(env.getElementUtils().getAllMembers((TypeElement)entityElement))) {
    String fieldType = fieldElement.asType().toString();
}

env是一个ProcessingEnvironment。 entityElement是一个元素。 (MyClass的)

fieldType设置为Key<Foo_>

我需要调用什么来将fieldType设置为Key<MyClass>

1 个答案:

答案 0 :(得分:2)

foo的类型是Foo_,就像在代码中一样。我认为代替Key<MyClass>你的意思是Key<Cow>,因为那是在那里使用的类型参数。使用Types实用程序,您可以使用方法getDeclaredType

从子类MyClass中看到字段的类型。
// these are the types as declared in the source
System.out.println(fieldElement.asType());      // Key<Foo_>
System.out.println(t.getSuperclass());          // MyAbstractClass<Cow>

// extract the type argument of MyAbstractClass
TypeMirror superClassParameter = ((DeclaredType) t.getSuperclass()).getTypeArguments().get(0);
System.out.println(superClassParameter);        // Cow

// use the type argument and the field's type's type element to construct the fields actual type
DeclaredType fieldType = typeUtils.getDeclaredType(
        (TypeElement) typeUtils.asElement(fieldElement.asType()), superClassParameter);

System.out.println(fieldType);                   // Key<Cow>