比较java.lang.Class和javax.lang.model.element.TypeElement的对象

时间:2015-11-14 19:44:10

标签: java class annotations

我写了一个接受java.lang.Class对象的注释。我想将带注释的类和注释值保存为文件中的键值对,但在我的情况下,这仅在注释值类可以从带注释的类中分配时才有效。

现在在我的注释处理器中,我从注释值获得了一个java.lang.Class对象,并且javax.lang.model.element.TypeElement作为带注释的类。

由于java.lang.Class只接受java.lang.Class isAssignableFrom方法,因此我不知道如何比较它们。 我也无法从javax.lang.model.element.TypeElement找到合适的方法。

我的代码是这样的:

Set<? extends Element> annotatedClasses = roundEnv.getElementsAnnotatedWith(DefaultOf.class);
for(clazz : annotatedClasses) {
    TypeElement asType = (TypeElement) clazz;
    Class<?> annotationVal = asType.getAnnotation(DefaultOf.class).value();
    if(annotationVal.isAssignableFrom((asType)) { // not working, wrong type
    }
}

我如何比较它们?

1 个答案:

答案 0 :(得分:1)

未经测试,但我使用的是类似代码:

Set<?extends Element> annotatedClasses = roundEnv.getElementsAnnotatedWith(DefaultOf.class);
for(Element clazz : annotatedClasses){
  TypeElement asType=(TypeElement)clazz;
  Class<?> annotationVal=asType.getAnnotation(DefaultOf.class).value();
  TypeMirror annotationValType = processingEnv.getElementUtils().getTypeElement(annotationVal.getCanonicalName()).asType();
  if(processingEnv.getTypeUtils().isAssignable(annotationValType, asType.asType())){
    //annotationVal class is assignable to annotated class
  }
}

基本上您需要获取TypeMirror类的类型(annotationVal),然后使用isAssignable

中的TypeUtils方法对其进行比较