小编典典

如何使用TypeMirror创建实例

java

我有一个注释,该注释根据此惯用法接收“动态”参数,即接口类型的参数。简而言之:

public interface MyInterface {}

public @interface MyAnnotation {
  Class<? extends MyInterface> value();
}

现在,要评估此参数,我需要创建提供的实现的实例。上面链接的答案是在运行时执行的。但是,我正在按照本教程编写“实时”(即编译时)注释处理器。使用类型时,必须考虑它们可能尚未编译。本教程以以下方式处理该问题(在这种情况下,检索类型的名称):

// Get the full QualifiedTypeName
try {
  Class<?> clazz = annotation.type();
  qualifiedSuperClassName = clazz.getCanonicalName();
  simpleTypeName = clazz.getSimpleName();
} catch (MirroredTypeException mte) {
  DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();
  TypeElement classTypeElement = (TypeElement)

classTypeMirror.asElement();
qualifiedSuperClassName =
classTypeElement.getQualifiedName().toString();
simpleTypeName = classTypeElement.getSimpleName().toString();
}

因此,要实例化类型,可以在try块中使用newInstance()。但是我必须在catch块中做什么才能创建实例?还是因为类型尚未编译而不可能?在这种情况下,如何解决“动态参数”问题?

编辑: 在我的特定情况下,我可能求助于使用String参数并将其解释为Groovy模板。虽然还在寻找答案。


阅读 441

收藏
2020-11-30

共1个答案

小编典典

在注释处理期间,通常情况下,不可能构造任何正在编译的类的实例。请记住,批注处理 在编译器内部
运行,是多步骤过程的一部分。不能保证在您的注释处理器执行时,类及其所有依赖项实际上已编译并可以加载。

另请注意,您的注释声明无效。Java语言规范的9.6.1节列出了注释元素的有效类型,并且用户定义的接口的值不是其中之一。充其量您可以拥有一个Class<? extends MyInterface>,但是关于如何实例化它也存在相同的问题。

听起来您的注释处理用例非常专业。如果您对要解决的实际问题提出了一个新的问题,这可能会有所帮助,因为可能有比这更好的解决方法。

2020-11-30