Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.reflect.Array'的用途是什么;什么是getter和setter方法?_Java_Arrays_Reflection - Fatal编程技术网

java.lang.reflect.Array'的用途是什么;什么是getter和setter方法?

java.lang.reflect.Array'的用途是什么;什么是getter和setter方法?,java,arrays,reflection,Java,Arrays,Reflection,Java类提供了一组用于动态创建数组的工具。然而,除此之外,它还有一整套访问(get、set和length)数组的方法。我不理解这一点,因为您可以(而且可能会)在创建时将动态生成的数组转换为数组,这意味着您可以使用普通数组访问(括号表示法)功能。事实上,通过查看源代码,您可以看到这就是类所做的全部工作,转换数组,如果转换失败,则抛出异常 那么,所有这些额外方法的意义/用处是什么 更新 考虑到您需要事先知道数组的类型才能知道使用哪种方法,所有的原语get*()和set*()方法似乎都没有什么帮助

Java类提供了一组用于动态创建数组的工具。然而,除此之外,它还有一整套访问(get、set和length)数组的方法。我不理解这一点,因为您可以(而且可能会)在创建时将动态生成的数组转换为数组,这意味着您可以使用普通数组访问(括号表示法)功能。事实上,通过查看源代码,您可以看到这就是类所做的全部工作,转换数组,如果转换失败,则抛出异常

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

更新

考虑到您需要事先知道数组的类型才能知道使用哪种方法,所有的原语
get*()
set*()
方法似乎都没有什么帮助

更新2


谢谢大家,你们的投入很有教育意义!除了
newInstance()
(可能还有
getLength()
)之外,我真的看不出什么时候我会使用这个类,但我现在意识到这些其他方法仍然非常有用。

如果您只知道“该对象是一个数组,那么这些方法可以减轻您自己检查和强制转换数组的负担。”(可能是原语)类型”


我自己只在框架和实用程序中见过它的用法,比如
commons beanutils
。这个框架反射性地访问java bean的属性,并使用
Array
方法访问数组属性的元素。

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

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

是的。当然,如果您知道类型,您可以自己编写代码-您只需强制转换。如果您不知道数组类型,或者它可以是多种类型,您可以检查可能性并适当地强制转换-这就是
reflect.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;
}
这意味着实际数组可以是
byte[]
short[]
int[]
。Harmony实现的情况并非如此,它只需要
int[]
(顺便说一句,Sun实现对大多数数组类使用本机方法。)get*()和set*()方法存在的原因与
get()
getLength()
-提供(松散地)类型无关的数组访问相同

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

关于
set…()
方法,它们确实提供了一些用途:

Object a = new byte[1], b = new short[1], c = new int[1], d = new long[1];
Array.setByte(a, 0, (byte)1);
Array.setByte(b, 0, (byte)1);
Array.setByte(c, 0, (byte)1);
Array.setByte(d, 0, (byte)1);
例如,要将值设置为
5
,您不需要知道正在处理的数组是
int[]
还是
long[]


Edit我更改了示例,希望能够演示
set…()
方法允许您不必静态地知道基元数组的类型。

我不明白您的意思,标准括号表示法在所有类型上都是统一的,包括基元。因为您注意到它返回一个对象,所以您最终还必须执行强制转换-对象或数组。因此,您为什么不呢st强制转换数组?有些用例你不关心类型。你不需要强制转换。例如,计算数组中的重复值。我用一个代码示例更新了我的答案。但是,原始的get/set方法似乎没有用,不是吗?哇,不知怎的,我从未意识到docjar不是Sun实现!谢谢你的帮助理解这一点的有用性。你能提供一个例子吗?我下载了commons beanutils的源代码并查找Array类的引用,但没有看到任何引用。
java.lang.reflect.Array
的grep应该会返回一些结果。请查看
中的
BeanUtilsBean
PropertyUtilsBean
>org.apache.commons.beanutils
package.Heh,我想Windows“全文搜索”根本不是很全文。谢谢。Hehe,这也正是我的发现。我刚刚找到了一个似乎可以解释这种行为的方法(至少对于XP):简言之,Windows文件搜索“太聪明了”,无法执行全文搜索。“get()方法返回一个对象…”-你可以用一个对象做很多事情…byte[]b=new byte[1];short[]s=new short[1];int[]i=new int[1];long[]l=new long[1];b[0]=(byte)1;s[0]=(byte)1;i[0]=(byte)1;同样有效…呃,它把我的新行搞砸了。@dimo414:你在所有这些方面都没有抓住重点。你不能使用[]运算符,除非它是数组。如果它是基元数组,除非知道基元类型,否则不能强制转换为数组。因此,如果您正在编写一个库函数,该函数应接受
字节[]
短[]
长[]
、或
int[]
并将第一个元素设置为5,您必须执行四次
实例检查以确定类型,然后将其强制转换到相应的基元数组,然后执行赋值。
array.setByte(someArrayRef,0,(byte)5)
执行与
Object a = new byte[1], b = new short[1], c = new int[1], d = new long[1];
Array.setByte(a, 0, (byte)1);
Array.setByte(b, 0, (byte)1);
Array.setByte(c, 0, (byte)1);
Array.setByte(d, 0, (byte)1);