/**
*?Demo描述:
*?Android中Java反射技術(shù)的使用示例
*?在Java中描述字節(jié)碼文件(xxx.class)的類叫Class
*?反射的過程可視為剖析Class的過程
*/
public?? class?? MainActivity?? extends?? Activity?{
@Override
protected?? void?? onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private?? void?? init(){
try{
/**
*?1?反射出無參的構(gòu)造方法并得到對象
*?注意:
*??????1?在Class.forName()中應(yīng)該傳入含有包名的類全名
*??????2?newInstance()方法的本質(zhì)是調(diào)用類的無參Public構(gòu)造方法
*/
String?className1="cn.testreflect.Worker";
Class?clazz1=Class.forName(className1);
Object?object1=clazz1.newInstance();
System.out.println("object1.toString()="+object1.toString());
/**
*?2?反射出帶參數(shù)的構(gòu)造方法并得到對象
*/
String?className2="cn.testreflect.Worker";
Class?clazz2=Class.forName(className2);
Constructor?constructor1=clazz2.getConstructor(int.class,String.class);
Object?object2=constructor1.newInstance(18,"小明");
System.out.println("object2.toString()="+object2.toString());
/**
*?3?獲取類的私有字段
*?注意:
*??????獲取共有字段應(yīng)調(diào)用clazz3.getField(name)方法
*/
String?className3="cn.testreflect.Worker";
Class?clazz3=Class.forName(className3);
Field?ageField1=clazz3.getDeclaredField("age");
System.out.println("ageField1="+ageField1);
/**
*?4?獲取和更改某個對象的私有字段
*???即模擬get()和set()方法
*/
String?className4="cn.testreflect.Worker";
Class?clazz4=Class.forName(className4);
Field?ageField2=clazz4.getDeclaredField("age");
Object?object4=constructor1.newInstance(18,"小明");
//取消訪問私有字段的合法性檢查
ageField2.setAccessible(true);
//獲取對象的私有字段
Object?ageObject4=ageField2.get(object4);
System.out.println("ageObject4="+ageObject4);
//再更改對象的私有字段的值
ageField2.set(object4,9527);
//重新獲得
Object?ageObject5=ageField2.get(object4);
System.out.println("ageObject5="+ageObject5);
/**
*?5?調(diào)用對象的帶參數(shù)的方法
*/
String?className5="cn.testreflect.Worker";
Class?clazz5=Class.forName(className5);
Method?method=clazz5.getMethod("printMessage",?String.class,int.class,int.class);
Object?object5=clazz5.newInstance();
method.invoke(object5,"周星星",50,9527);
}catch(Exception?e)?{
System.out.println(e.toString());
}
}
}