一、反射
- 反射就是把java类中的各种成分映射成相应的java类。
- 例如,一个java类中用一个Class类的对象来表示一个类中的组成部分:成员变量,方法,构造函数,包 等信息也用一个个的java类来表示,
- 就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。
- 表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,
- 这些信息就是用相应类的实例对象来表示,他们是Field,Method,Constructor,Package等等
- 一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,
- 通过调用Class类的方法可以得到这些实例对象,
- 得到这些实例对象后有什么用呢?怎么用呢?这就是学习和应用反射的要点
二、数组的反射
- 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
- 代表数组的Class实例对象的getSuperclass()方法返回的父类Object类对应的Class
- 基本类型的一维数组可以被当做Objec类型使用,不能当做Object[]类型使用,
- 非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
- Arrays.asList()方法处理int[] 和 String[] 时的差异
import java.util.Arrays;
public class ReflectDemo {
public static void main(String[] args) throws Exception
{
int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[4];
System.out.println(a1.getClass().getName());//[I
System.out.println(a2.getClass().getName());//[I
System.out.println(a3.getClass().getName());//[[I
System.out.println(a4.getClass().getName());//[Ljava.lang.String;
a1 = new int[]{1,2,3};
a4 = new String[]{"abc","def","ghi"};
System.out.println(Arrays.asList(a1));//[[I@1fb8ee3]
System.out.println(Arrays.asList(a4));//[abc, def, ghi]
}
}
三、数组反射的应用----Array类
- java.lang.reflect.Array 类提供了动态创建和访问 Java 数组的方法。
- Array 允许在执行 get 或 set 操作期间进行扩展转换,
- 但如果发生收缩转换,则抛出 IllegalArgumentException
public final class Array
{
//没有构造方法,并且方法全是静态的
//返回指定数组对象中索引组件的值。如果该值是一个基本类型值,则自动将其包装在一个对象中
public static Object get(Object array,
int index)
throws IllegalArgumentException,
ArrayIndexOutOfBoundsException{}
//以 boolean 形式返回指定数组对象中索引组件的值。
public static boolean getBoolean(Object array,
int index)
throws IllegalArgumentException,
ArrayIndexOutOfBoundsException{}
getByte getShort getInt getLong getChar getFloat getDouble
//创建一个具有指定的组件类型和维度的新数组
public static Object newInstance(Class<?> componentType,
int... dimensions)
throws IllegalArgumentException,
NegativeArraySizeException{}
public static Object newInstance(Class<?> componentType,
int length)
throws NegativeArraySizeException{}
//将指定数组对象中索引组件的值设置为指定的新值。
public static void set(Object array,
int index,
Object value)
throws IllegalArgumentException,
ArrayIndexOutOfBoundsException{}
//将指定数组对象中索引组件的值设置为指定的 byte 值
public static void setByte(Object array,
int index,
byte b)
throws IllegalArgumentException,
ArrayIndexOutOfBoundsException{}
setChar setShort setInt setLong setFloat setDouble
//以 int 形式返回指定数组对象的长度。
public static int getLength(Object array)
throws IllegalArgumentException{}
}
四、示例
import java.lang.reflect.Array;
//遍历任意数组
public class ReflectDemo {
public static void main(String[] args)
{
int[] arr = {1,5,3,8,9};
String[] str = {"abcd","45dd","sdf"};
print(arr);
print(str);
}
private static void print(Object obj) {
Class clazz = obj.getClass();
if(clazz.isArray())
{
for(int x=0;x<Array.getLength(obj);x++)
System.out.println(Array.get(obj, x));
}
else
{
System.out.println(obj);
}
}
}