我有一个注释,根据这个成语接收“动态”参数,即接口类型的参数。简言之:
public interface MyInterface {}
public @interface MyAnnotation {
Class<? extends MyInterface> value();
}现在,要评估这个参数,我需要创建一个提供的实现的实例。上面链接的答案是在运行时完成的。然而,我正在按照本教程编写一个“真实”(即编译时)注释处理器。在使用类型时,您必须考虑它们可能尚未编译。本教程以以下方式处理这个问题(在这种情况下检索类型的名称):
//获取完整的QualifiedTypeName尝试{ Class clazz = annotation.type();qualifiedSuperClassName = clazz.getCanonicalName();simpleTypeName = clazz.getSimpleName();} catch (MirroredTypeException mte) { DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement();TypeElement= qualifiedSuperClassName =()()};
因此,要实例化类型,我可以在try块中使用newInstance()。但是,我必须在catch块中做什么才能创建一个实例?还是因为类型尚未编译而不可能?在这种情况下,如何解决“动态参数”问题?
编辑:在我的具体案例中,我可能会使用一个字符串参数并将其解释为一个模板。但仍在寻找答案。
发布于 2016-08-30 15:31:22
在注释处理期间,一般情况下不可能构造正在编译的任何类的实例。请记住,作为多步骤进程的一部分,注释处理在编译器中运行。不能保证类及其所有依赖项都在执行注释处理器时实际编译并准备好装入类。
还请注意,您的注释声明无效。Java语言规范第9.6.1节列出了注释元素的有效类型,而用户定义的接口的值不是其中之一。充其量,您可以拥有的是一个Class<? extends MyInterface>,但是对于如何实例化它有同样的问题。
听起来您的注释处理用例非常专业化。如果你打开一个关于你想要解决的实际问题的新问题,它可能会有帮助,因为可能有一个更好的方法来解决它。
https://stackoverflow.com/questions/39222612
复制相似问题