2011-03-08 133 views
2

鉴于这两类得到实际的类型,而不是类型参数时,Java 1.6的注释处理

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>

+0

从子类MyClass见过?类MyAbstractClass的一个? – 2011-03-08 08:45:42

回答

2

foo的类型是Foo_,就像它在代码中一样。我认为,而不是Key<MyClass>你的意思是Key<Cow>,因为那是在那里使用的类型参数。使用Types工具,就可以得到该字段的类型使用,当你得到的输出TypeElement正在处理方法getDeclaredType

// 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> 
相关问题