dim*_*414 6 java arrays reflection
Java类java.lang.reflect.Array提供了一组用于动态创建数组的工具.然而,除此之外,它还有一整套用于访问(获取,设置和长度)数组的方法.我不明白这一点,因为您可以(并且可能会)在创建时将动态生成的数组转换为数组,这意味着您可以使用常规数组访问(括号表示法)功能.实际上,查看源代码,您可以看到这是所有类所做的,转换数组,并在转换失败时抛出异常.
那么所有这些额外方法的重点/用处是什么?
更新
考虑到你需要预先知道数组的类型以便知道使用哪种方法,所有的原语get*()和set*()方法似乎都特别无益.
更新2
谢谢大家,您的意见非常有教育意义!我真的不知道什么时候我会把这个类用于除了newInstance()(也许getLength())以外的任何东西,但我现在意识到这些其他方法仍然非常有用.
这个类非常深奥 - 大多数数组的使用都知道数组的类型,因此在实现一般处理数组的代码时,这个类通常最有用.
所有数组都没有数组超类,因此无论类型如何,都没有统一的方法来访问元素或数组的大小.该java.lang.reflect.Array填补了这一空白,并允许您从类型,无论访问以同样的方式排列.例如,从任何数组获取给定索引处的值(作为对象返回).
它是参数多态性.当然,你可以自己编码,如果你知道类型 - 你只是投.如果您不知道数组类型,或者它可以是几种类型,您可以检查可能性并进行适当的转换 - 这就是代码的reflect.Array作用.
编辑:回应评论.考虑如何解决此问题 - 如何计算值在数组中重复的次数.如果没有类型无关的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;
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:关于get*()和set*()方法.上面的源代码链接链接到Apache和声.那里的实现不遵守Sun Javadocs.例如,来自getInt方法
@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
Run Code Online (Sandbox Code Playgroud)
这意味着实际的数组可能是byte[],short[]或int[].Harmony实现不是这种情况,只需要一个int[].(顺便说一句,Sun实现使用大多数Array类的本地方法.)的get*()和set*()方法有出于同样的原因为get(),getLength()-提供(宽松)类型无关的数组访问.
并不是每天都需要使用的东西,但我认为它为那些需要它的人提供了价值.