反射的基石---Class类

如何得到各个字节码对应的实例对象( Class类型)
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass()
Class.forName("类名"),例如,Class.forName("java.util.Date");
九个预定义Class实例对象:
参看Class.isPrimitive方法的帮助
Int.class == Integer.TYPE


反射就是把Java类中的各种成分映射成相应的java类。

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 StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));
 //调用获得的方法时要用到上面相同类型的实例对象
Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
 

Field类

Field类代表某个类中的一个成员变量
演示用eclipse自动生成Java类的构造方法
问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,而不是具体的x变量。
示例代码:
 ReflectPoint point = new ReflectPoint(1,7);
 Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y");
 System.out.println(y.get(point));
 //Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getField("x");
        x值的修饰符为private,需要用到暴力反射
       1)获得getDeclaredField("x");2)设置可获取x.setAccessible(true);
 Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("x");
 x.setAccessible(true);
 System.out.println(x.get(point));
作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。


 public class ReflectPoint {
 private int x;
 public  int y;
 public String str1 = "ball";
 public String str2 = "bassball";
 public String str3 = "wang";
 
 public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public String toString() {
  return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="
    + str3 + "]";
 }
 
}
 

public class ReflextTest {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub

  ReflectPoint rPoint1 = new ReflectPoint(2, 3);
  changeBToA(rPoint1);
  System.out.println(rPoint1);
 }
 
 public static void changeBToA(Object point) throws Exception{
  Field[] fields = point.getClass().getFields();
  for (Field field : fields) {
   if(field.getType() == String.class){
    //
    String oldString = (String) field.get(point);
    String newString = oldString.replace('b', 'a');
    field.set(point, newString);
   }
  }
  
 }

}
 

结果:ReflectPoint [str1=aall, str2=aassaall, str3=wang]