如何使用TypeMirror创建实例

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

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模板。虽然还在寻找答案。

回答:

在注释处理期间,通常情况下,不可能构造任何正在编译的类的实例。请记住,批注处理 在编译器内部

运行,是多步骤过程的一部分。不能保证在您的注释处理器执行时,类及其所有依赖项实际上已编译并可以加载。

另请注意,您的注释声明无效。Java语言规范的9.6.1节列出了注释元素的有效类型,并且用户定义的接口的值不是其中之一。充其量您可以拥有一个Class<?

extends MyInterface>,但是关于如何实例化它也存在相同的问题。

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

以上是 如何使用TypeMirror创建实例 的全部内容, 来源链接: utcz.com/qa/400553.html

回到顶部