对具有原始数字返回类型的方法的反思

2023-11-22

我目前正在开发一个小型框架来收集 OSGi 系统中的指标。 它的核心是注释@Metric,它指示服务的给定方法可以在被请求时提供度量(例如数值)。

这些方法看起来像:

@Metric
public int getQueueSize() {...}

or

@Metric
public double getAvgTaskTime() {...}

我使用反射来检查服务实现类并注册注释的方法@Metric。作为健全性检查,我正在检查该方法是否确实提供了一个数值。我尝试了这个但失败了:

for (Method method: metricSource.getClass().getMethods()) {
    if (method.isAnnotationPresent(Metric.class) &&  Number.class.isAssignableFrom(method.getReturnType()) { 
        // add method for later process
    }

然后,稍后在处理器上,我会这样做:

Number value = (Number) method.invoke(target, obj[]);

事实证明,对于原始类型,您会得到例如int.class这不能分配给 Number.class,而装箱类型 Integer.class 可以。该死。继续前行。

然后我创建了一个Map<Class<?>, Extractor>其中 Extractor 接受一个类并将参数转换为该类:

public NumberExtractor(Class<? extends Number> clazz) {
    this.clazz = clazz;
    }       
    public double extract(Object val) {
        Number nbr = clazz.cast(val);
        return nbr.doubleValue();
    }
}

面对之前的观察,我添加了这样的条目:

extractorMap.put(int.class, new NumberExtractor(int.class));

但这也不起作用。它给出了运行时类转换异常,指出 Integer.class 无法转换为 int。另请注意,编译器不会抱怨new NumberExtractor(int.class),让边界检查Class<? extends Number>传递int.class

最后,这个组合奏效了:

extractorMap.put(int.class, new NumberExtractor(Integer.class));

这里发生了什么? Reflection说对象的返回类型(int.class)不能分配给Number.class,但是当我继续调用方法时,我实际上得到了一个Integer.class?威士忌探戈狐步舞?!

我想知道除了维护 int -> Integer、Integer -> Integer、float -> Float、Float -> Float 的映射之外是否还有其他方法来解决这个问题? (现在已经完成了,所以这是为了学习)

装箱和类型信息的行为在这里似乎不一致。

有人能解释一下吗?


Reflection说对象的返回类型(int.class)不能分配给Number.class,但是当我继续调用方法时,我实际上得到了一个Integer.class?

绝对地。反射 API 不能possibly返回给你一个实际的int,因此它将值装在Integer。它还能做什么?

事实上它必须装箱not更改可分配性int to Number。看着那(这文档用于isAssignableFrom:

如果此 Class 对象表示基本类型,且指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回 false。

所以它的行为完全按照文档进行。

我想知道除了维护 int -> Integer、Integer -> Integer、float -> Float、Float -> Float 的映射之外是否还有其他方法来解决这个问题? (现在已经完成了,所以这是为了学习)

是的,这对我来说听起来不错。或者只是有一个Set<Class>对于原始数字类型而不是显式映射。

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

对具有原始数字返回类型的方法的反思 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 为什么反射会减慢Android手机的速度

    我多次读到反射会降低手机性能 这有多真实 例如 在我的例子中 我从 Web 服务获取一些参数 这些参数与我在 Android 应用程序中的类的参数同名 所以我只是使用java字段和反射设置这些参数的值 它似乎并没有降低性能 有人可以向我解释
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 如何调试缓慢的 Office 应用程序互操作构造函数?

    我有一个处理 Excel 的应用程序 最近我遇到了创建 Excel 对象非常慢的问题 我用这个简单的代码重新创建了这个问题 Microsoft Office Interop Excel Application xlApp xlApp new
  • 使用值绑定分配的依赖属性不起作用

    我有一个带有依赖属性的用户控件 public sealed partial class PenMenu UserControl INotifyPropertyChanged public event PropertyChangedEvent
  • 一组元素中具有最大高度的元素

    我有一套div元素 在jQuery 我希望能够找出div最大高度以及该高度div 例如 div div class panel Line 1 Line 2 div div class panel Line 1 br Line 2 br Li
  • 将数据框转换为每月时间序列

    我有一个 100 年每月数据 1200 个数据点 的数据框 其中月份在列中 年份在行中 我想将其转换为每月的时间序列 并且我尝试了多种方法 但没有一种方法可以创建正确的 时间 结构 问题在于 R 将数据框视为 12 个变量 月份 的 100
  • C 指针算术 sizeof(struct)

    这是有问题的代码 include
  • 在 DVCS 中维护 Changelog.txt 文件

    我正在开发一个使用大量分支的 git 项目 在大多数情况下 这是一个非常棒的工作流程 我很高兴在分支之间进行合并 喜欢能够挑选代码 以及 git 和其他 dvc 附带的整体生命周期 我有一个痛点 真的很痛 如何维护changelog txt
  • 在大型解决方案中编译 C# 项目时如何利用多核 CPU?

    据我所知 VS2008 MSBuild不支持C 项目的多线程编译 不知道VS2010是否支持 您知道有这样做的第三方产品或开源项目吗 确实是MSBuild确实支持多核 虽然它有点像黑客 有一些限制 更容易从命令行 同样 一些构建服务器 如果
  • Dotpeek重新编译反编译文件

    我如何重新编译我编辑的代码 或者用原来的文件替换并在dotpeek中另存为exe 我尝试重新编译编辑的文件并保存它 但我不能 如果您找到任何方法请分享 谢谢 右键单击 Assembly Explorer 窗格中打开的文件 然后选择 导出到项
  • 在联接表 JPA 2 中映射额外属性

    我正在尝试按照此链接建模这种关系http www javaworld com javaworld jw 01 2008 images datamodel gif 这是订单和产品之间通常的多对多关系 但我不知道如何在连接表中添加额外的列 En
  • 如何使用 C# 获取 Windows 上 chrome.exe 的路径?

    我想从我的自动化测试框架启动 chrome 以便我可以测试我的服务器端 ASP NET 代码 确定 chrome exe 在我的计算机上的位置的最佳方法是什么 当 Chrome 安装在计算机上时 它会安装ChromeHTML网址协议 您可以
  • 如何缩小 .git 文件夹

    我目前的基地总面积约为 200MB 但我的 git 文件夹有 5GB 的惊人大小 由于我将工作推送到外部服务器 因此我不需要任何大量的本地历史记录 如何缩小 git 文件夹以释放笔记本上的一些空间 我可以删除 30 天之前的所有更改吗 莱纳
  • C++ 中“(void) new”是什么意思?

    我一直在看 Qttutorial它使用了我以前从未见过的结构 void new QShortcut Qt Key Enter this SLOT fire void new QShortcut Qt Key Return this SLOT
  • 比较 groovy 中的版本字符串

    嘿 我创建了一个 Groovy 脚本 它将提取某些文件夹的版本号 然后我想比较版本号并选择最高的 我让脚本在 dir 文件夹中运行 然后获取以下格式的版本 02 2 02 01 所以我可以得到这样的东西 02 2 02 01 02 2 02
  • 用于 Python 的 MS Analysis Services OLAP API [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在寻找一种方法来连接到 MS Analysis Services OLAP 多维数据集 运行 MDX 查询并将结果提取到 Python 中 换句话说 这正是 Excel 所做
  • 如何配置我的 iPhone 项目以使用单独的应用程序图标进行测试版

    我想要实现的是 我发送给 Beta 测试人员的构建中的应用程序图标与将提交审批的应用程序图标不同 这将使我和我的 Beta 测试人员能够轻松识别该应用程序是 Beta 版本 我不确定是否应该添加构建脚本来修改 info plist 并更改其
  • 如何将 Swift 结构作为参数传递给 Objective-C 方法

    我有一个接受类型参数的 Objective C 方法id我想向它传递一个 Swift 结构 ObjcClass m file implementation ObjcClass void addListener id listener Do
  • 在自定义活动设计器中将数据绑定到组合框

    我有一个自定义活动 有一个参数是一个字符串 但是 我不想让设计者输入任意字符串 而是希望向设计者提供一个带有选项列表的组合框 这些选项是动态的 并且从数据库加载到 List 集合中 我的问题是我不知道如何将设计器中的组合框绑定到此列表并将选
  • 通过网络读取和解析大型文本文件的最佳方法是什么?

    我遇到一个问题 需要我解析远程计算机上的多个日志文件 有一些并发症 1 该文件可能正在使用中 2 文件可能很大 100mb 3 每个条目可以是多行 为了解决使用中的问题 我需要先复制它 我目前正在将其直接从远程计算机复制到本地计算机 并在那
  • 如何在Python中的散点图上绘制一条线?

    我有两个数据向量 并将它们放入pyplot scatter 现在我想对这些数据绘制线性拟合 我该怎么做 我尝试过使用scikitlearn and np polyfit import numpy as np from numpy polyn
  • 对具有原始数字返回类型的方法的反思

    我目前正在开发一个小型框架来收集 OSGi 系统中的指标 它的核心是注释 Metric 它指示服务的给定方法可以在被请求时提供度量 例如数值 这些方法看起来像 Metric public int getQueueSize or Metric