- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个注释,根据 this idiom 接收“动态”参数,即接口(interface)类型的参数。简而言之:
public interface MyInterface {}
public @interface MyAnnotation {
Class<? extends MyInterface> value();
}
现在,为了评估此参数,我需要创建所提供的实现的实例。上面链接的答案在运行时执行此操作。然而,我正在编写一个“真正的”(即编译时)注释处理器,如下 this tutorial 。使用类型时,您必须考虑它们可能尚未编译。本教程通过以下方式处理该问题(在这种情况下检索类型的名称):
// 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
block 中使用 newInstance()
。但是我必须在 catch
block 中做什么来创建实例?或者是因为类型还没有编译所以不可能?那么,如何解决“动态参数”问题呢?
编辑:在我的具体情况下,我可能会使用 String 参数并将其解释为 Groovy 模板。但仍在寻找答案。
最佳答案
在注释处理期间,一般情况下不可能构造正在编译的任何类的实例。请记住,注释处理在编译器内部运行,作为多步骤过程的一部分。无法保证类及其所有依赖项在注释处理器执行时实际已编译并准备好类加载。
另请注意,您的注释声明无效。 Section 9.6.1 of the Java language specification列出了注释元素的有效类型,用户定义接口(interface)的值不是其中之一。你最多能拥有的是 Class<? extends MyInterface>
,但是关于如何实例化它,您会遇到同样的问题。
听起来您的注释处理用例非常专业。如果您针对您要解决的实际问题提出一个新问题,可能会有所帮助,因为可能有比这更好的方法来解决它。
关于java - 如何从 TypeMirror 创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222612/
我有一个 AnnotationProcessor,它读取 spring webmvc 注释并根据它找到的内容生成代码。 代码运行良好,但我需要弄清楚如何对采用 javax.lang.model.typ
我正在使用镜像并想确定一个 ClassMirror 是否是另一个的子类型。有点像: ClassMirror type = me.getField(someSymbol).type; // obviou
我有一个注释,根据 this idiom 接收“动态”参数,即接口(interface)类型的参数。简而言之: public interface MyInterface {} public @inte
我正在使用 Java 的注释处理机制为我的一些类创建序列化程序。 我想检查当前处理类的每个字段并确保它是 MyBaseSerializableClass 的子类。 我的问题是我只知道如何找到字段类型的
我正在做 Java APT 并想解析一个方法(ExecutableElement)。现在我需要方法的返回类型。如果它是一个数组,我不知道如何获取类型。 示例:String[] foobar() 我想获
我刚刚在这里开始使用 javax AnnotationProcessing,遇到了一个丑陋的案例。我将在描述我的学习过程的一系列伪代码行中对其进行说明: MyAnnotation ann = elem
相应于'dart:mirror'上的bool isSubtypeOf(TypeMirror other)文档 /** * Checks the subtype relationship, d
我有一个注释处理器,它接受一个带注释的类并尝试创建它的一个子类: package test; import com.squareup.javapoet.ClassName; import com.sq
我正在开发一个带有注释处理的代码生成器,并将逻辑分为 2 个步骤: 分析带注释的元素并创建数据模型,以及 使用数据模型使用 JavaPoet 生成代码。 在大多数情况下,注释处理 API 为我们提供了
在实用程序界面的文档中 Types ,其中一个实例必须由编译器提供给 Java SE 6 或 7 的注释处理器,对于我正在处理的代码片段,有两种方法让我感兴趣。我需要检查字段的类型是否是从特定抽象类继
我不明白如何在注释处理器中检索枚举值。 我的注释是自定义 Java Bean Validation 注释: @StringEnumeration(enumClass = UserCivility.
我正在使用 Java 注释处理器。我的注释 @foo 用于标记可以在运行时读取到文件或从文件中读取的字段变量。但是,我想在编译时检查变量类型是否实现了 Serializable,这样如果该字段不可序列
有什么方法可以检查 javax.lang.model.type.TypeMirror 是否是原始类型?我尝试过 instanceof PrimitiveType 但这总是产生 true,因为 Prim
我正在将 Java 7 项目迁移到 Java 8。有一种方法正在做这样的事情: if(type instanceof PrimitiveType){ PrimiriveType type = (
我正在编写注释处理器,我需要检查是否有特定的 TypeMirror实现特定接口(interface)。问题Java Annotations Processor: Check if TypeMirror
我有一个 DeclaredType一个字段,我想获得该字段的完全限定类型(原始类型?)。例如,如果字段是: public static Optional foo; 我想得到 java.util.Opt
我的 Xamarin.Forms 有问题不想再加载,它一直给我错误消息 Unable to cast object of type 'System.RuntimeType' to type 'Mono
我是一名优秀的程序员,十分优秀!