java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么?

2023-12-25

Java类java.lang.reflect.Array http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Array.html提供了一组用于动态创建数组的工具。然而除此之外,它还有一整套用于访问(获取、设置和长度)数组的方法。我不明白这一点,因为您可以(并且可能会)在创建时将动态生成的数组转换为数组,这意味着您可以使用正常的数组访问(括号表示法)功能。事实上,查看源代码,您可以看到该类所做的全部工作就是转换数组,并在转换失败时抛出异常。

那么所有这些额外方法的意义/用处是什么?

Update

一切都是原始的get*() and set*()方法似乎尤其没有帮助,考虑到您需要事先知道数组的类型才能知道使用哪种方法。

Update 2

谢谢大家,你们的意见非常有教育意义!我实在看不出什么时候I'd将此类用于除newInstance()(有可能getLength()),但我现在意识到这些其他方法仍然非常有用。


这个类非常深奥 - 数组的大多数使用都知道数组的类型,因此在实现一般处理数组的代码时,这个类通常最有用。

没有适用于所有数组的数组超类,因此无论类型如何,都没有统一的方法来访问元素或数组的大小。这java.lang.reflect.Array填补了这一空白,并允许您以相同的方式访问数组,无论类型如何。例如,从任何数组中获取给定索引处的值(作为对象返回)。

It's 参数多态性 http://en.wikipedia.org/wiki/Type_polymorphism#Parametric_polymorphism。当然,如果您知道类型,您可以自己编写代码 - 您只需进行强制转换。如果您不知道数组类型,或者它可以是多种类型,您将检查可能性并进行适当的转换 - 这就是代码中的内容reflect.Array does.

编辑:回应评论。考虑如何解决这个问题 - 如何计算一个值在数组中重复的次数。如果没有与类型无关的 Array 类,则在不显式转换数组的情况下将无法进行编码,因此您需要为每种数组类型使用不同的函数。在这里,我们有一个处理任何类型数组的函数。

public Map<Object, Integer> countDuplicates(Object anArray)
{
    if (!anArray.getClass().isArray())
        throw new IllegalArgumentException("anArray is not an array");

    Map<Object,Integer> dedup = new HashMap<Object,Integer>();
    int length = Array.getLength(anArray);
    for (int i=0; i<length; i++)
    {
        Object value = Array.get(anArray, i);         
        Integer count = dedup.get(value);
        dedup.put(value, count==null ? 1 : count+1);
    }
    return dedup;
}

EDIT2:关于 get*() 和 set*() 方法。上面的源代码链接链接到 Apache Harmony。那里的实现不遵守 Sun Javadocs。例如,从getInt http://java.sun.com/javase/6/docs/api/java/lang/reflect/Array.html#getInt(java.lang.Object,%20int) method

@throws IllegalArgumentException If the specified object is not an array, 
or if the indexed element cannot be converted to the return type 
by an identity or widening conversion 

这意味着实际的数组可以是byte[], short[] or int[]。 Harmony 实现的情况并非如此,它只需要int[]。 (顺便说一句,Sun 实现对大多数 Array 类使用本机方法。) get*() 和 set*() 方法的存在原因与get(), getLength()- 提供(松散的)类型不可知的数组访问。

不完全是你每天都需要使用的东西,但我想它为那些需要它的人提供了价值。

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

java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么? 的相关文章

  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • 帮助我避免 JPA、Hibernate 和 MySQL 的连接超时

    我正在使用 JPA Hibernate 作为提供者 Glassfish 和 MySQL 开发中一切都运行良好 但是当我将应用程序部署到测试服务器并让它运行 大部分空闲 过夜时 我通常会在早上遇到这样的情况 2011 03 09T15 06
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似
  • vm 参数中的 -D 是什么,它表示为什么我们必须在 vm 参数中始终指定 -D

    vm 参数中的 D 是什么 它表示为什么我们必须在 vm 参数中始终指定 D 有什么标准吗 如果是 那是什么以及指定的位置 D 设置当前运行的 java 程序可以访问的属性值 它允许程序员设置程序运行所需的值 但程序不知道这些值是什么 因此
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • Servlet 调度程序当前不可用

  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • Qcut Pandas:ValueError:Bin 边缘必须是唯一的

    我使用 Pandas 中的 Qcut 将数据离散化为大小相等的存储桶 我想要有价格桶 这是我的数据框 productId sell prix categ popularity 11997 16758760 0 28 75 50 524137
  • 如何在Java中模拟引用传递?

    我是一个十足的 Java 菜鸟 我知道 Java 将所有参数视为按值传递 并且还有其他几个线程人们对此进行了解释 例如 在 C 中我可以这样做 void makeAThree int n n 3 int main int myInt 4 m
  • 如何在速度模板中检索哈希图值

    如何从速度模板中的以下哈希图中检索值 请帮忙 LinkedHashMap
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • Cruise 与 TeamCity 与 CruiseControl.net [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 单例 PDO 模型 - 层次结构

    抱歉英语不好 我是巴西人 更糟糕的是谈论编程 我们走吧 我有这个 class DataBase extends PDO var object PDO private static instance Cria uma inst ncia do
  • 查找:-exec 缺少参数

    今天我得到了一个命令的帮助 但它似乎不起作用 这是命令 find home me download type f name rm exec ffmpeg i sameq mp3 rm 外壳返回 find missing argument t
  • 重新启动 gif 动画而不重新加载文件

    是否可以重新启动 gif 动画而不需要每次都下载文件 我当前的代码如下所示 var img new Image img src imgages src myImage gif id css background image url img
  • java.io.InvalidClassException:没有有效的构造函数

    当我运行下面的程序时 我收到异常 java io InvalidClassException Files SerializationMain Files SerializationMain no valid constructor at j
  • Databricks JDBC 集成安全性

    帮助 我需要使用我的 Azure AD 凭据从 Azure databricks 集群连接到 SQL Azure 实例 我已经测试过了 我可以通过我的 Azure AD 凭据使用 SSMS SQL Server Management Stu
  • 订阅 Angular 2

    我希望我的 ngOnInit 函数做接下来的事情 使用 this structRequest sendRequest 发出一些数据的 http 请求 效果很好 并且在收到数据后开始使用 this viewNodes 函数查看它 我使用 su
  • 网站图标必须为 32×32 或 16×16 吗?

    我想使用单个图像作为常规图标和 iPhone iPad 友好图标 这可能吗 如果作为常规浏览器图标链接 iPad 友好的 72 72 PNG 会缩放吗 或者我是否必须使用单独的 16 16 或 32 32 图像 2020 年更新 坚持 16
  • 检测倾斜字体中单词之间的空格(条)

    我编写了一个 python 脚本来检测图像中编码的字母 该脚本正在使用openCV模板匹配匹配图像中嵌入的字符 字母 除空格 空格键 字符外 检测工作正常 Here is a sample image 在 python 中是否有一些 简单
  • Pandas DataFrame 访问器类型提示

    Pandas 允许您使用以下方法扩展其 DataFrame 类pd api extensions register dataframe accessor 装饰师 虽然这是功能性的 但它不提供任何额外的类型提示功能 例如 我希望以下内容能够键
  • 视角约束有什么意义?

    在哪视图约束 http download oracle com docs cd B14117 01 server 101 b10759 clauses002 htm i1002565有用 我的意思是 Oracle 允许在视图上创建约束 它们
  • 用 AppCompat 替换 ActionBarSherlock

    我目前正在开发一个简单的导航抽屉 滑动选项卡 然而 我希望在我自己的应用程序上进行材料设计 所以 除了摆脱 我别无选择ActionBarSherlock 在这些尝试中 我发现有两种类型的导入 如下所示 import com actionba
  • 由属性公开的私有变量[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我搜索了一些文档 并尝试了 Xcode 和 AppCode 但我仍然对一些事情不确定 那么有人可以澄清我吗 如果我有名为 foo 的属性 是否应
  • Visual Studio 构建步骤和 MSBuild 构建步骤之间的差异

    我正在创建一些构建定义 我发现 Visual Studio 构建步骤和 MSBuild 构建步骤之间的唯一区别是 VS 构建步骤将 Visual Studio 版本添加到构建中 有人可以解释更多差异吗 正如丹尼尔提到的 它们几乎是一样的 主
  • 如何使用 Obj-C 轻松保存窗口大小和位置状态?

    使用 Obj C 记住应用程序加载之间的 Windows 位置的最佳方法是什么 我正在使用 Interface Builder 作为界面 是否可以通过绑定来做到这一点 推荐的方法是什么 谢谢 在 Interface Builder 的属性下
  • Nivoslider 更新或重启甚至销毁

    我在加载动态内容时尝试更新 nivoslider 时遇到一些问题 我需要做的是当我通过加载新内容时更新滑块AJAX call 所以基本上我有一个 div 从函数中获取新数据AJAX调用并在加载后我需要滑块重新初始化 我现在做的是这样的 if
  • Python 中的简单素数生成器

    有人可以告诉我这段代码做错了什么吗 无论如何 它只是打印 计数 我只想要一个非常简单的素数生成器 没什么花哨的 import math def main count 3 one 1 while one 1 for x in range 2
  • 反转带有重音字符的字符串?

    所以我看到了乔恩的双向飞碟video http vimeo com 7403673并且有一个代码示例 应该是有问题 逆转后 但我想它在 net2上失败了 恕我直言 无论如何它确实对我有用并且我确实看到了correct反转的字符串 char
  • 如何防止移动设备上弹出键盘?

    http api jqueryui com spinner http api jqueryui com spinner 我正在尝试在我的网站中使用上面的 jQuery spinner 它的演示位于 API 底部 它在计算机上确实有效 但在移
  • java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么?

    Java类java lang reflect Array http docs oracle com javase 8 docs api java lang reflect Array html提供了一组用于动态创建数组的工具 然而除此之外