当前位置: 首页 > 面试题库 >

如何使用TypeMirror创建实例

姬庆
2023-03-14
问题内容

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

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>,但是关于如何实例化它也存在相同的问题。

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



 类似资料:
  • 我有一个NotificationProcessor,它可以读取Springwebmvc注释并根据它发现的内容生成代码。 代码运行得很好,但是我需要弄清楚如何对一个方法进行单元测试,该方法将< code > javax . lang . model . type . type mirror 作为参数,并返回它的字符串类型表示,包括泛型(例如< code>java.util.Map 因此,为了对此方法

  • 我正在尝试使用guice,我想在JavaPlay2.6中创建一个单例随机webservice客户端 现在我有了WS-client,它作为java播放模块加载。当我运行应用程序时,没有问题,我的客户机能够使用java play配置(),这是注入的。但是如果我尝试在其他任何地方使用我的客户机,我会得到一个错误,说。 这是我的(非常简单的)客户: 实现Guice的AbstractModule的我的模块:

  • 我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端。 我已经为此进行了广泛的搜索,并且真的碰壁了,所以希望有人能帮忙。 我能够得到我的音频输入从API。 然后将流传递给函数,该函数使用API创建createMediaStreamSource` 在我的函数中,我现在有一个对象,我可以流式处理它。 目前,我通过套接字连接以流的形式发送音频事件,如下所示: 这是最好的

  • 我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体:

  • 问题内容: 我想用实用程序方法创建一个类,例如 创建实用程序类的最佳方法是哪一种? 我应该使用私有构造函数吗? 我应该将实用程序类设为抽象类吗? 我应该什么都不做? 问题答案: 对于Java中完全无状态的实用程序类,我建议将该类声明为和,并具有一个私有构造函数以防止实例化。的关键字,可避免子类,并且可以在运行时提高工作效率。 该类应包含所有方法,并且不应声明(因为这意味着该类不是具体的,必须以某种