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

是否可以在运行时访问Java 8类型信息?

凌和颂
2023-03-14
问题内容

假设我在使用Java 8类型注释的类中具有以下成员:

private List<@Email String> emailAddresses;

是否可以@Email在运行时使用反射读取在String类型上使用的给定注释?如果是这样,将如何进行?

更新:这是注释类型的定义:

@Target(value=ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {}

问题答案:

是的,有可能。表示这种结构的反射类型称为AnnotatedParameterizedType。这是如何获取注释的示例:

// get the email field 
Field emailAddressField = MyClass.class.getDeclaredField("emailAddresses");

// the field's type is both parameterized and annotated,
// cast it to the right type representation
AnnotatedParameterizedType annotatedParameterizedType =
        (AnnotatedParameterizedType) emailAddressField.getAnnotatedType();

// get all type parameters
AnnotatedType[] annotatedActualTypeArguments = 
        annotatedParameterizedType.getAnnotatedActualTypeArguments();

// the String parameter which contains the annotation
AnnotatedType stringParameterType = annotatedActualTypeArguments[0];

// The actual annotation
Annotation emailAnnotation = stringParameterType.getAnnotations()[0];

System.out.println(emailAnnotation);  // @Email()


 类似资料:
  • 假设我有一个这样的Kotlin函数类型的Kotlin 1.1 我可以从Java访问它 是否有可能以某种方式从Java以科特林类型别名(即)访问科特林接口?

  • 问题内容: 背景 我对 Java泛型的 理解是它完全是一个 编译时 功能(主要侧重于类型安全检查)。任何泛型类的类型信息在运行时都会丢失( 类型擦除 )。 不过,我看到许多框架 似乎 也在运行时利用类型信息。例如,google guice Providers。guice提供程序可以在运行时实例化并提供其通用类型的新实例。 题 是否还有与泛型类型相关的信息,这些信息也会在运行时保留。? 如果 是 ,

  • 问题内容: 例如,假设我想“提取” 为三个单独的变量,例如: 我该怎么做,而忽略了 “为什么要这么做呢?” 您可能会被问到这个问题。 之前已经多次问过类似的问题,但是从未给出真正的答案,因为OP真正需要的是使用不同的方法。很好,但这有可能吗? 我看过反射,似乎没有任何方法可以使我甚至向实例添加额外的字段,更不用说动态创建本地了。 问题答案: 是否可以在Java运行时创建变量? 简单回答是不。 Ja

  • 问题内容: 我正在一个项目中,该项目有很多由库创建的对象,并且无法访问这些对象的创建过程。 以下代码片段很好地说明了我的问题。 码: 是Clazz在编译时可能会或可能不会实现的接口。 码: 以下代码是我遇到的问题。请注意以下几点: 仅在c是的实例时调用。 并且都是我无法访问的类中的私有方法。 在编译时,将 不 包含名为的方法。 ExampleExecutor 不是 我的课程。我无法以任何方式访问它

  • 问题内容: 为了更好地理解Java中的工作原理,我想知道是否可以在运行时动态地向类路径添加目录。 例如,如果我使用 “ java -jar mycp.jar” 启动一个 .jar 并输出 java.class.path 属性,则可能会得到: 现在可以在运行时修改该类路径以添加另一个目录吗?(例如,在使用我要添加的目录中的 .jar 首次调用类之前)。 问题答案: 您可以使用以下方法: 但是您需要使

  • 问题内容: 我很好奇JVM的工作方式。JVM是否承认诸如“专用”之类的方法可访问性规则受保护,还是仅在编译时完成? 例如,是否可以在第37行附近进行一些字节码操作并调用一个受保护的方法,例如test3?通常,编译器不会让我调用该方法,因为它被声明为protected。但是我很好奇,是否在运行时强制执行了该受保护的规则? u.test1(); //在运行时是否可以通过字节码操作来调用“ test3”