---------------------- android培训、java培训、期待与您交流! --------------------
一、什么是反射
反射就是把Java类中的各种成分映射成相应的java类。
Java可以加载一个运行时才得知名称的class,获得其完整结构。
二、Class类
用一个类来描述Java类,这个类就叫做Class类。
Class类的每个实例对象代表一份字节码,即Java类的字节码。
Class与public class XX{}中的class不同
Person p = new Person();
1 Class cls = Person.class //字节码 即类名.class
还有两种得到各个字节码对应的实例对象( Class类型 )的方法:
2 对象.getClass()
3 Class.forName(“完整的类名eg:java.lang.String”); //反射的时候用,因为在写源程序的时候还不知道类的名字 ,可以写成一个变量
Class的实例对象代表内存中的一份字节码
什么是字节码? 当我们用到一个类的时候Person 首先要从硬盘上把二进制字节码加载到内存,再用这些字节码去复制出一个个对象
Class.forName()的作用?
返回字节码,有两种方式:1 这份字节码曾经被加载过 已经在java虚拟机里面直接返回;2 java虚拟机里还没有这份字节码则用类加载器去加载
9个预定义的class对象 即8个基本类型+void
Class.isPrimitive() Int.class == Integer.TYPE
数组类型的Class实例对象 Class.isArray()
只要是在原程序中出现的类型,都有各自的Class实例对象像int[] ,void
反射就是把java类中的各种成分映射成相应的java类
小结:一个Class代表一份字节码,一个Method代表字节码中的一个方法,一个Constructor代表字节码中的一份构造方法
Constructor类
得到某个类所有的构造方法:
Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();
得到某一个构造方法:Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//获得方法时要用到类型
创建实例对象
通用方式:String str = new String(new StirngBuffer(“abe”));
反射方式:String str = (String)constructor.newInstance(new StringBuffer(“abc”)); *//调用获得的方法时要用到上面相同类型的实例对象
Class.newinstance()
Field类 * 代表某个字节码中的变量,而不代表某个对象身上的变量
例:将任意一个对象中的所用String类型的成员变量所对应的字符串内容中的 “b” 改成 ”a”
ReflectPoint.java
Public class ReflectPoint{
private int x;
public int y;
public String str1 = “ball”;
public String str2 = “basketball”;
public String str3 = “it”;
public ReflectPoint(int x, int y){
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
Return str + “:” + str1+ “:” + str2+ “:” + str3;
}
}
ReflectTest.java
Import java.lang.reflect.Field;
Import java.lang.reflect.Method;
public class ReflectTest{
public static void main(String[] args) throws Exception{
String str1 = “abc”;
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName(“java.lang.Sring”);
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
System.out.println(cls1.isprimitive());
System.out.println(int.class.isPrimitive());
System.out.println(int.class == Integer.class);
System.out.println(int.class == Integer.TYPE);
System.out.println(int[] .class.isPrimitive());
System.out.println(int[] .class.isArray());
Constructor constructor1 = String.class.getConstructor(String
String str2 = (String)constructor1.newInstance(new);
ReflectPoint pt1 = new ReflectPoint(3,5);
Filed fieldY = pt1.getClass().getField(“y”);//fieldy的值是多少?是5,错。
System.out.println(fieldY.get(pt1));//变量y在对象pt1中的值。
Field fieldX = pt1.getClass().getDeclaredField(“x”);//获得字节码中不可见的x变量
fieldX.setAccessible(true);//暴力反射。
System.out.println(fieldX.get(pt1));
changeStringValue(pt1);
System.out.println(pt1);
Method methodCharAt = String.class.getMethod(“charAt”,int.class);
System.out.println(methodCharAt.invoke(str1,1));
}
private static void changeStringValue(Object obj) throws Exception{
Field[] fields = obj.getClass().getFields();
For(Field field : fields){
if(field.getType() == String.class){ //对字节码应该用 == 比较
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace(‘b’,’a’);
field.set(obj, value);
}
}
}
}
Method类 是代表类里边的方法不是对象的方法
main方法是静态的
数组:维数相同, 类型相同得到的字节码是一份。
int [] a1 = new int[3];
int [] a2 = new int[4];
int [][] a3 = new int[2][3];
String [] a4 = new String[3];
System.out.println(a1.getClass() == a2.getClass());//int[].class==int[].class
System.out.println(a1.getClass() == a4.getClass());//int[].class==String[].class
System.out.println(a1.getClass() == a3.getClass());//int[].class==int[][].class
结果:
true
false
false
---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima