当类型嵌套时,TYPE_USE 注释会丢失,通用接口[重复]

2023-12-30

当带注释的类型是嵌套的泛型接口时,似乎无法通过反射访问 TYPE_USE 注释。

请观察以下示例:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;

public class LostAnnotation {
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.TYPE_USE)
  public @interface SomeTypeAnnotation {
  }

  @SomeTypeAnnotation Map<String, String> map;
  @SomeTypeAnnotation Entry<String, String> entry;

  public static @SomeTypeAnnotation Entry<String, String> someMethod(
      @SomeTypeAnnotation Map<String, String> map,
      @SomeTypeAnnotation Entry<String, String> entry) {
    return null;
  }

  public static void main(String[] args) throws Exception {
    Class<LostAnnotation> clazz = LostAnnotation.class;
    Method method = clazz.getMethod("someMethod", Map.class, Entry.class);
    AnnotatedType[] types = method.getAnnotatedParameterTypes();

    print("map field", clazz.getDeclaredField("map").getAnnotatedType());
    print("map parameter", types[0]);

    print("entry field", clazz.getDeclaredField("entry").getAnnotatedType());
    print("entry parameter", types[1]);
    print("entry return type", method.getAnnotatedReturnType());
  }

  static void print(String title, AnnotatedType type) {
    System.out.printf("%s: %s%n", title, Arrays.asList(type.getAnnotations()));
  }
}

The 预期产出上面的代码是

map field: [@LostAnnotation$SomeTypeAnnotation()]
map parameter: [@LostAnnotation$SomeTypeAnnotation()]
entry field: [@LostAnnotation$SomeTypeAnnotation()]
entry parameter: [@LostAnnotation$SomeTypeAnnotation()]
entry return type: [@LostAnnotation$SomeTypeAnnotation()]

但是,那实际产量上面的代码是

map field: [@LostAnnotation$SomeTypeAnnotation()]
map parameter: [@LostAnnotation$SomeTypeAnnotation()]
entry field: []
entry parameter: []
entry return type: []

从每次使用中都可以正确检索注释Map界面。然而,在每次使用Entry接口,无论是字段、返回类型还是参数,注释都会丢失。我对此的唯一解释是Entry接口是嵌套在里面 the Map界面。

我在 win64 上最新的 oracle JDK (8u121) 上运行了上面的示例。我做错了什么或者这可能是一个错误吗?

为了便于阅读,我的注释是嵌套的。使其成为顶级接口不会改变任何东西。


这已经被发现在SO:为什么泛型类型参数上的注释对于嵌套类型不可见? https://stackoverflow.com/questions/39952812/why-annotation-on-generic-type-argument-is-not-visible-for-nested-type

答案是错误已提交,但优先级较低,因为这些情况不会经常出现。

不过,您仍然可以使用字节好友 https://github.com/raphw/byte-buddy解析字节码并检索带注释的类型。

ASM http://asm.ow2.org/根据我的经验,它也有效,并且我怀疑任何字节码解析器都可以解决这个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当类型嵌套时,TYPE_USE 注释会丢失,通用接口[重复] 的相关文章

  • 将比较器对象存储在数组中

    我为我的对象定义了 4 个比较器 如下所示 public static Comparator
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • 在 Java 中重置 Graphics2D 对象

    我正在用 Java 尝试 Graphics2D 但像往常一样 我被困住了 P 问题是 假设我有这个代码 Graphics2D g Graphics2D this getGraphics Inside a JFrame g rotate Ma
  • 模拟框架对我有什么作用?

    我听说有些我无法交谈的人是 jmock 的忠实粉丝 我已经做了以测试为中心的开发多年 所以我浏览了网站并查看了一些文档 但仍然不知道它有什么好处 我对春天也有同样的问题 如果您已经了解它是什么 他们的文档会很好地解释它 所以我并不认为 jm
  • 如何检测线程是否被IO阻塞?

    在Java中 线程可以有不同的状态 新的 可运行的 阻塞的 等待的 TIMED WAITING 的 终止的 然而 当线程被IO阻塞时 其状态为 RUNNABLE 如何判断是否被IO阻塞 NEW 线程已创建但尚未处理 可运行 线程正在占用CP
  • Hamcrest 泛型地狱 #2:iterable With Size 给出错误“不适用于参数”

    在 hamcrest 中 1 3 RC2 没有 JUnit 依赖项 我使用失败iterableWithSize 我有一个 扩展 Iterator参数化为Content像这样EndResult
  • mvn dependency:analyze 结果不正确

    我一直在寻找一种工具 它能够向您显示未使用的依赖项 我很快就偶然发现了 Maven 命令mvn dependency analyze 这样做的问题是 它经常检测到 未使用的 依赖项 如果缺失 这些依赖项就会导致构建失败 这是优化项目的示例
  • JLabel.setText() 中的换行符

    使用 JLabel setText 时如何插入换行符 我尝试使用 Html 但似乎可以使其适用于 setText 仅适用于 jLabel 的初始声明 最初声明 jlabel 时的方法是 label new JLabel Hello Worl
  • lombok - 多个镜头中的 @Builder 模式

    I use Builder of 龙目岛项目 https github com rzwitserloot lombok 所以考虑我有这个例子 Builder public class Client private Getter Setter
  • Android - Java - 发送 facebook 聊天消息的意图(facebook 禁用 xmpp)

    Facebook 已弃用 xmpp API 有没有办法打开意图 或将数据传递到fb 以在Android设备上发送聊天消息 设备上安装的 Facebook 和 Messenger 应用 谢谢 您需要将 uri 传递给意图 这里10000572
  • 带有 spring-kafka 的 Kafka 死信队列 (DLQ)

    最好的实施方式是什么死信队列 DLQ Spring Boot 2 0 应用程序中的概念 使用 spring kafka 2 1 x 来处理无法处理的所有消息 KafkaListener某些bean发送到某些预定义的Kafka DLQ主题的方
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • SOAP Web 服务中的用户身份验证

    我提出了一个关于JAX WS 身份验证和授权 如何 https stackoverflow com questions 5314782 jax ws authentication and authorization how to 讨论了安全
  • GAE - Eclipse 中的开发服务器未更新?

    我在 Eclipse 上使用 Google AppEngine 开发服务器 我的本地网页似乎没有更新 直到我在开发服务器上进行了多次重新启动 使用 Eclipse 中的 运行 或 调试 按钮 我究竟做错了什么 基本流程是 更改 java 文
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • 如何将我的自定义相机应用程序设置为默认应用程序?

    如果我使用以下代码 Intent takePictureIntent new Intent MediaStore ACTION IMAGE CAPTURE startActivityForResult takePictureIntent 1
  • 当相应的 JTextfield 为空时,如何填充 JTable 中的所有项目

    我正在 Java 项目中设计一个高级搜索选项sqlite在 NetBeans 中 有5种不同JTextfields和 5 列 我想填充JTable具有相应的匹配标准 如果一个JTextfield为空 那么它应该选择该列的所有项目 我使用的查
  • java.lang.NoClassDefFoundError:com.google.ads.AdView

    我正在尝试将 admob 广告合并到我的应用程序中 到目前为止我已经添加了以下代码 在我的应用程序主要活动的 onCreate 方法中 adView new AdView this AdSize BANNER my code number
  • 1° 夏令时 Java 和 JS 表现出不同的行为

    假设巴西利亚 GMT 0300 夏令时于 21 10 2012 00 00 00 此时时钟应提前一小时 Java new Date 2012 1900 9 21 0 0 0 Sun Oct 21 01 00 00 BRST 2012 Chr
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • 在 Go 中通过名称调用结构体及其方法?

    我发现了一个函数调用MethodByName here http golang org pkg reflect Value MethodByName http golang org pkg reflect Value MethodByNam
  • Spring ApplicationContext.getBean(Class c) 不适用于代理类

    我需要通过豆类的类类型查找豆类 当bean被代理包装时 某些方法是 Transactional ApplicatoinContext无法找到它们 我发现如果我通过接口查找它们 它是有效的 但在这种情况下我正在使用具体的类类型 我知道该 be
  • AJAX - Spring 控制器 - JSP

    我想生成对 Spring MVC 控制器的 AJAX 基于 jQuery 请求 并将带有对象的 Collection 返回到 jsp 我有两个烦恼 1 AJAX成功块不起作用 数据类型的东西 2 不知道如何将这个对象显示到jsp上
  • C 中的 Salted sha512,无法与 Symfony2 的 FOSUserBundle 同步

    我的开发分为两个部分 该网站是一个使用 FOSUserBundle 的 Symfony 应用程序 它使用 SHA512 和盐对密码进行加密 一个用 C 语言编程的身份验证模块 一旦给出盐和明文密码 它应该能够重现 SHA512 加盐哈希 有
  • 如何用数据库数据填充TableView

    我一直在尝试加载TableView从数据库查询数据 但似乎无法让它工作 这是我第一次尝试填充TableView与数据库查询项目 以防我的代码看起来杂乱且远非良好 FXML 是通过 JavaFX SceneBuilder 完成的 这是数据库查
  • protobuf-net AddField 忽略 IgnoreListHandling

    我有这个数据结构声明 ProtoContract public class NotACollectionHolder public NotACollection some objects ProtoContract IgnoreListHa
  • ctypes.pointer、ctypes.POINTER 和 ctypes.byref 之间有什么区别?

    在ctypes中 指针和byref有什么区别 它们似乎都是将指针传递给函数的一种方式 例如作为输出参数 从功能上来说 它们是等效的 但是 那蟒蛇文档 http docs python org release 2 5 2 lib ctypes
  • 为什么我的 WinForm 控件在绘制事件之前闪烁?

    我有一个表单 其中加载了一个用户控件 其中包含 3 个其他用户控件 每次我移动到另一个选项卡并返回到该用户控件时 其中的 3 个控件甚至在事件触发之前就会闪烁 我尝试了一切 包括 this DoubleBuffered true this
  • 水平平滑动量滚动

    问题 我需要平滑一些鼠标滚轮水平的滚动到此布局 https jsfiddle net 38qLnzkh https jsfiddle net 38qLnzkh 选择 我发现这个脚本完全符合我的要求 但它似乎只能垂直工作 黄油 js http
  • VS2017 设置项目 - 在哪里?

    我正在尝试为 C 项目创建安装项目 安装程序 但在 VS2017 中找不到 安装项目 模板 在 VS2015 中它位于 其他项目类型 gt gt 设置和部署 gt gt Visual Studio 安装程序 我用过几次没有任何问题 我的 V
  • 带有半圆边缘的 android 按钮

    我正在尝试创建一个用于 Android 项目中的图像按钮的形状 该形状基本上在左侧和右侧都有半圆 我想我可以只使用带有半径的形状 XML 但这只是圆角 我需要整个左侧和右侧是半圆 如下图所示 我当前的形状 XML 如下所示
  • Java Apache FileUtils readFileToString 和 writeStringToFile 问题

    我需要将 java 文件 实际上是 pdf 解析为字符串并返回到文件 在这些过程之间 我将对给定的字符串应用一些补丁 但这在本例中并不重要 我开发了以下 JUnit 测试用例 String f1String FileUtils readFi
  • .Net - 什么时候 List.ForEach 优于标准 foreach 循环?

    通用列表类有一个 ForEach Action
  • `null` 被视为字符串?

    String s null s s hai System out println s Output nullhai 我以为这会让我陷入 NPE 状态 背后的根本逻辑是什么 使用时不抛出NPE 级联 使用时抛出NPE For s s hai
  • 为什么 Jackson 要使用以类命名的额外层来包裹我的对象?

    当我序列化时 public class FOO int field1 String field2 我得到以下内容 FOO field1 0 field2 value 你能指出我怎样才能使输出看起来像这样 field1 0 field2 va
  • 什么会使单个任务执行器停止处理任务?

    我正在使用一个java util concurrent ExecutorService我通过调用获得的Executors newSingleThreadExecutor This ExecutorService有时会停止处理任务 即使它尚未
  • 如何将 Owl Carousel 中的图像居中

    我的猫头鹰旋转木马包含不同宽度和高度的图片 如何将它们水平和垂直居中对齐 owl example owlCarousel navigation true div class owl carousel div img div div
  • 按名称对 'ls' 输出进行排序

    你能排序一个ls https en wikipedia org wiki Ls按名称列出 我的 ls 默认按名称排序 你看到什么了 man ls states 列出有关文件的信息 默认为当前目录 如果没有 则按字母顺序对条目进行排序 cft
  • 如果值为 0,如何隐藏 HTML 表格行

    我有一个 HTML 表格 有 4 列 Item Code Item Name Category Name and Quantity其中数量为输入字段 我正在做的是用 JSON 数据填充表 最初输入字段设置为 0 当用户由于大量数据而在输入字
  • 当类型嵌套时,TYPE_USE 注释会丢失,通用接口[重复]

    这个问题在这里已经有答案了 当带注释的类型是嵌套的泛型接口时 似乎无法通过反射访问 TYPE USE 注释 请观察以下示例 import java lang annotation ElementType import java lang a