首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在TypeMirror中创建实例

如何在TypeMirror中创建实例
EN

Stack Overflow用户
提问于 2016-08-30 08:38:09
回答 2查看 719关注 0票数 0

我有一个注释,根据这个成语接收“动态”参数,即接口类型的参数。简言之:

代码语言:javascript
运行
复制
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块中做什么才能创建一个实例?还是因为类型尚未编译而不可能?在这种情况下,如何解决“动态参数”问题?

编辑:在我的具体案例中,我可能会使用一个字符串参数并将其解释为一个模板。但仍在寻找答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-30 15:31:22

在注释处理期间,一般情况下不可能构造正在编译的任何类的实例。请记住,作为多步骤进程的一部分,注释处理在编译器中运行。不能保证类及其所有依赖项都在执行注释处理器时实际编译并准备好装入类。

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

听起来您的注释处理用例非常专业化。如果你打开一个关于你想要解决的实际问题的新问题,它可能会有帮助,因为可能有一个更好的方法来解决它。

票数 2
EN

Stack Overflow用户

发布于 2016-08-30 15:52:29

威尔·Lp的回答是他删除的,因为它与Groovy有关,而与Java无关。

然而,我确实认为这是相关的。

当使用Groovy时,您实际上可以使用将闭包作为类参数传递给注释

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39222612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档