------- android培训、java培训、期待与您交流! ----------
反射:将Java类中的成分抽取出来映射成对象
Class 类:
Class类的实例对象对应各个类在内存中的字节码
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
得到字节码的实例对象的3种方法:
1.类名.class
2.对象.getClass() // new Date().getClass()
3.Class.forName(“类名”)//Class.forName(“java.util.Date”)
九个预定义实例对象:
包括八个基本类型和Void//int.class==Integer.TYPE;
数组类型Class实例对象:Class.isArray();
Method 类:
得到类中的方法:
Method charAt=Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
charAt.invoke(str,1);//str==null,说明该方法是静态方法(用invoke调用方法)
练习:调用函数的main方法:
String name=args[0];//需要在运行前输入变量
Method m=Class.forName(name).getMethod("main", String[].class);
m.invoke(null,(Object)new String[]{});//main方法为静态的不需要传递对象Constructor类:
得到类中的构造函数:
所有构造函数:Constructor[] con=Class.forName(“java.lang.String”).getConstructor();
某一个:Constructor con=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象:
String str=(String)constructor.newinstance(new StringBuffer(“aaa”));
Field类:
得到类中的成员变量:
Feild f1=obj.getClass().getField(x);//获取x变量
Feild[] f=obj.getClass().getFields();//获得所有成员变量
练习:需求:将一个对象中所有String类型成员变量中的‘b’替换成‘a’
private static void change_b2a(Object obj) throws Exception {
Field[] f1=obj.getClass().getFields();//获取所有成员变量
for(Field f:f1){
if(f.getType()==String.class){//如果是String类型
String sold=(String) f.get(obj);//get()方法获得
String snew=sold.replace('b','a');
f.set(obj, snew);//set()方法设置为新的值
}
}
}
数组的反射:
//数组的反射
int []a1=new int[2];
int []a2=new int[3];
int [][]a3=new int[2][3];
String []a4=new String[2];
System.out.println(a1.getClass() == a2.getClass());//true
System.out.println(a1.getClass().getSuperclass() == a3.getClass().getSuperclass());//true
System.out.println(a1.getClass().getSuperclass() == a4.getClass().getSuperclass());//true
System.out.println(a1.getClass().equals(a3.getClass()));//false
//System.out.println(a1.getClass()==a4.getClass());//不兼容
System.out.println(a1.getClass().getName());//[I
System.out.println(a1.getClass().getSuperclass());//class java.lang.Object