反射的基石---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]