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+ "]";
}
}