package day5demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public classday5demo2 {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stu
Stringstr1="abc";
//三種獲得class對象的方法
Class cls1=str1.getClass();
Classcls2=String.class;
Classcls3=Class.forName("java.lang.String");
System.out.println(cls1==cls2);
System.out.println(cls2==cls3);
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,但是並不知道它是誰的Constructor,只有在運行時才知道它是String的Constructor。
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
//newInstance方法的返回值是一個Object,但是不知道是哪個對象,所以要轉換成String,
//要不然會報錯,newInstance中的參數類型來確定調用哪一個構造方法。
Stringstr2=(String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
// Field類反射應用示例代碼:
ReflectPointpt1=newReflectPoint(3, 5);
Fieldfiedy=pt1.getClass().getField("y");
//fiedy的值是多少?5,錯。fiedy代表的是類的變量,而不是對象的變量,要用它去獲取對象上變量的值。
Fieldfiedx=pt1.getClass().getDeclaredField("x");//訪問申明的成員。
fiedx.setAccessible(true);//暴力反射,訪問私有成員變量時需要添加該方法設//置訪問權限,也叫暴力反射。
System.out.println(fiedy.get(pt1));
System.out.println(fiedx.get(pt1));
//利用方式實現將一個類裏面的所有字符串成員變量中的”b”改成”a”。
changeStringValue(pt1);
System.out.println(pt1);
//利用反射調用String類的方法。
MethodMethodCharAt=String.class.getMethod("charAt", int.class);
System.out.println(MethodCharAt.invoke(str1,1));
}
private static voidchangeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
Field[]fields = obj.getClass().getFields();
for(Field field:fields)
{
if(field.getType()==String.class)
{
Stringoldvalue=(String)field.get(obj);
Stringnewvalue=oldvalue.replace("b", "a");
field.set(obj,newvalue);
}
}
}
}
ReflectPoint類:
package day5demo;
public classReflectPoint {
private int x;
public int y;
public String str1="ball";
public 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 "ReflectPoint [x="+ x + ", y=" + y + ", str1="+ str1
+", str2="+ str2+ ", str3="+ str3+ "]";
}
}