如何使用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