String str="abc";
Class cls1=str.getClass();
Class cls2=String.class;
Class cls3= Class.forName("java.lang.String");
System.out.println(cls1==cls2);
System.out.println(cls2==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());//數組
輸出結果:
true
true
false
true
false
true
false
true
構造函數的反射運用:
Constructor constroctor1 = String.class.getConstructor(StringBuffer.class);
String str2= (String)constroctor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
輸出 c
通過反射取 變量
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY= pt1.getClass().getField("y");//共有類型用getField()
//fieldY不是某個對象身上的變量,而是類上,要用它去取某個對象上對應的值
System.out.println(fieldY);
System.out.println(fieldY.get(pt1));
Field fieldX= pt1.getClass().getDeclaredField("x");//私有類型用getDeclaredField()
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
public class ReflectPoint {
private int x;
public int y;
public String str1="ball";
private String str2="basketball";
public String str3="itcast";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return str1+":"+str2+":"+str3;
}
}
輸出
public int cn.itcast.day1.ReflectPoint.y
5
3
函數的反射
Method methodCharAt= String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str, 1));
System.out.println(methodCharAt.invoke(str, new Object[]{2}));
構造函數的反射
String startClassName=args[0];
Method mainMethod=Class.forName(startClassName).getMethod("main",String[].class);
mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
輸出:
b
c
111
222
333
編寫一個函數 傳進一個對象,如果這個對象的String類型的變量裏有含有b則用 a替換
private static void changeStringValue(Object obj) throws Exception {
// TODO Auto-generated method stub
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, newValue);
}
}
}
public class ReflectPoint {
private int x;
public int y;
public String str1="ball";
private String str2="basketball";
public String str3="itcast";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return str1+":"+str2+":"+str3;
}
changeStringValue(pt1);
System.out.println(pt1);
輸出:
aall:basketball:itcast
這個方法只能替換 public類型的String變量,如果是private 則不能獲得變量的值,無法替換;私有類型用getDeclaredField()