ASP.Net+Android+IOS开发.Net培训期待与您交流!
数组的反射
1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class
3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用
4Arrays.asList()方法处理int[] 和String[]时的差异
5Array工具类用于完成对数组的反射1.什么叫反射?
JAVA中的类有很多,这些类同属一类事物,描述这些事物的JAVA类就是Class。
对比提问,众多的人用Person表示,众多的java类用Class表示。
Person类的实例为各个具体的人,张三李四,那么Class的实例代表什么呢?那就是各个java类在内存中的字解码文件,例如Array,Math在内存中的字节码文件,当然各个类在内存中的字节码文件都是不同的,这些字节码文件类似,这就
相当于每个对象。
2.如何得到这些类的字节码对应的实例对象呢?
对象名.getClass(),例如 new Integer().getClass()
Class.forName("类名的绝对路径") 例如Class.forName("java.util.Properties")
判定此 Class 对象是否表示一个数组类。
Class.isMemberClass()
当且仅当底层类是成员类时返回 true。
最重要一句话,就是反射就是把java中的各个成分(包,方法,构造方法,数据)映射成相应的类
3:Class常用方法
Class.forName(String classname);
Class.getFiled()
Class.getFileds();
Class.getMethod();
Class.getConstruct(construct name);
Class.getConstructs();
isPrimitive()
4.练习
反射的基本练习
import java.lang.reflect.*;
public class RefTest{
public static void main(String[] args)throws Exception{
Integer a = 1;
Class cl1 = a.getClass();
Class cl2 = Integer.class;
Class cl3 = Class.forName("java.lang.Integer");
System.out.println(cl1 == cl2);
System.out.println(cl1 == cl3);
System.out.println(cl1.isPrimitive());//Integer不是一个基本类型
System.out.println("int类型是否是基本类型");
System.out.println(int.class.isPrimitive());//int是一个基本类型
System.out.println("int 和 Integer是否产生同一字节码");
System.out.println(int.class == Integer.class);
System.out.println("int 和 Integer的实例是否是一字节码");
System.out.println(int.class == Integer.TYPE);
System.out.println("void的字节码");
System.out.println(void.class);
System.out.println("数组是不是基本类型");
System.out.println(int[].class.isPrimitive());
System.out.println("判断是否是数组类型");
System.out.println(int[].class.isArray());
Class.isArray();
Constructor cos = String.class.getConstructor(StringBuilder.class);
//Class也有newInstance,它调用的是类原有无参的构造方法,这样比较简便。
String str = (String)cos.newInstance(new StringBuilder("abc"));
System.out.println(str);
ReflectPoint rp = new ReflectPoint(2,3);
//此处filedY不代表值,代表类上的,他代表所有对象该值的抽象,取某个对象的值必须指定对象。
Field fieldY = rp.getClass().getField("y");
System.out.println(fieldY.get(rp));
}
}
class ReflectPoint{
private int x;
public int y;
public ReflectPoint(int x,int y){
this.x = x;
this.y = y;
}
}
使用反射把一个字符串中的字母‘a’换成‘b’,数字加1
public static void replace(String p) throws IllegalArgumentException, IllegalAccessException{
Field[] fs = p.getClass().getFields();
for(Field f:fs){
if(f.getType() == String.class){
String oldValue =(String)f.get(p);
String newValue = oldValue.replace('b', 'a');
f.set(p, newValue);
}else if(f.getType() == int.class){
int oldValue = (Integer)f.get(p);
int newValue = oldValue++;
f.set(p, newValue);
}
}
使用反射查看类的私有变量
ReflectPoint rp = new ReflectPoint(2,3);
Field fieldX = rp.getClass().getDeclaredField("x");
fieldX.setAccessible(true);//x为私有的
System.out.println(fieldX.get(rp));
使用反射调用String的方法
//下面使用反射调用String的方法
Method method = str.getClass().getMethod("charAt", int.class);
System.out.println(method.invoke(str, 2));//invoke是把这个方法执行一下
//如果invoke的第一个参数是null,则代表该方法是静态方法
使用反射操作数据
应注意这几点:
1具有相同维数和元素类型的数组属于同一类型,即具有相同的Class实例对象
2代表数组的Class实例对象的getSuperClass()方法返回的父类为Objece类对应的Class
3基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既能当作Object类型使用,又可以当作Object[]类型使用
4Arrays.asList()方法处理int[] 和String[]时的差异
5Array工具类用于完成对数组的反射
public class ReflectTest {
public static void main(String[] args){
int[] arr1 = new int[]{1,2};
int[] arr2 = new int[]{1,2,3};
int[][] arr3 = new int[1][2];
String[] arr4 = new String[]{"good","morning"};
System.out.println(arr1.getClass() == arr2.getClass());
System.out.println(arr1.getClass().getName());
System.out.println(arr1.getClass().getSuperclass().getName());
System.out.println(arr4.getClass().getSuperclass().getName());
Object aObj1 = arr1;
Object aObj2 = arr2;
Object[] aObj3 = arr3;
Object[] aObj4 = arr4;
System.out.println(aObj1);
System.out.println(aObj2);
System.out.println(Arrays.asList(aObj1));
System.out.println(Arrays.asList(aObj4));
printObject(arr1);
printObject("good");
}
private static void printObject(Object obj){
if(obj.getClass().isArray()){
for (int i = 0; i < Array.getLength(obj); i++) {
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}
}
class TestArguments{
public static void main(String[] args){
for(String arg:args){
System.out.println(arg);
}
}
}