黑马程序员_反射

---------------------- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值