数组
数组由Java虚拟机实现,数组的方法继承于Object,数组的长度不是其类型的一部分可以通过 java.lang.reflect.Array.getLength()
来获取。
反射提供了访问数组类型和数组组件类型的方法,创建一个新的数组,获取或者设置数组的的组件值。下面就来跟我一起走进反射的数组吧
确定数组类型
tip:数组可以通过调用
Class.isArray()
方法来获取。
下面一个例子列出了数组的组件类型和里面的值
1 | public class ArrayFind { |
执行方法
1 | ArrayFind.main("java.nio.ByteBuffer"); |
得到结果
1 | I/System.out: final byte[] java.nio.ByteBuffer.hb |
可以看到我们获取了一个字段 [B B是byte [标识数组
创建数组
类似于非反射代码,反射支持通过java.lang.reflect.Array.newInstance()
. 动态创建任意类型的任意长度数组。
下面来写一个创建数组的例子:
1 | public class ArrayCreator { |
我们从上面的例子中可以看到几个方法首先:,Array.newInstance(c, n)
其实是调用了Array的构造方法创建了一个Array,然后调用java.math.BigInteger
的构造函数创建一个BigInteger
,最终调用Array.set(o, i, val);
来给创建的实例来添加成员
get或者set数组
首先介绍存取数组的方法,设置整个数组的方法是java.lang.reflect.Field.set(Object obj, Object value)
,拿数组的方法是 Field.get(Object)
也可以用java.lang.reflect.Array
.中的方法设置或去除数组。其提供了设置基本类型的方法,如设置int
,就用Array.setInt(Object array, int index, int value)
取呢就用Array.getInt(Object array, int index)
.引用类型呢?提供的方法是Array.set(Object array, int index, int value)
和Array.get(Object array, int index)
.来存取。
设置数组类型的字段
下面的例子替换BufferReader为更大,其构造方法可以设置大小。
1 | public class GrowBufferedReader { |
可以看到我们先从从类中拿到了其缓存的数组,然后对其数组进行重新设置大小
设置多维数组
怎么理解多维数组?二维数组就是一维数组的数组,三维数组就是二维数组的数组,以此类推,下面我们举例来说明怎么创建多维数组
1 | import java.lang.reflect.Array; |
当我们执行main方法得到
1 | matrix[0][0] = 1 |
使用下面的方法可以得到同样的结果
1 | Object matrix = Array.newInstance(int.class, 2); |
Array.newInstance(Class componentType, int... dimensions)
提供了创建多维数组的方法,但是原理其实一样的,就是数组嵌套数组。
枚举
获取枚举的成员
反射提供了枚举所特定的API
Class.isEnum()
表示是否为枚举类型。
Class.getEnumConstants()
获取枚举的枚举顺序。
java.lang.reflect.Field.isEnumConstant()
表示此字段是否表示枚举类型的元素。
我们来举例获取枚举的成员
1 | import java.util.Arrays; |
当我输入EnumConstants.main("java.util.concurrent.TimeUnit")
,可以得到
1 | Enum name: java.util.concurrent.TimeUnit |
当输入EnumConstants.main()
可以得到:
1 | Enum constants: [HADEAN, ARCHAEAN, |
那么我们可以知道Arrays.asList(c.getEnumConstants())
和Arrays.asList(Eon.values())
返回的东西是一样的
set或者get枚举
1 | import java.lang.reflect.Field; |
其实就跟设置字段的值是一样的!创建成功然后设置就可以了。如果看过前两章的介绍的话,应该很简单