JAVA學(xué)習(xí)之反射
JAVA中所有類(lèi)的祖先類(lèi)都是object類(lèi),object類(lèi)有一個(gè)很暴力的方法 getClass 例子,通過(guò)他得到子類(lèi)的類(lèi)名:getSimpleName
public?class?Test11A?????{
?????public?void???check(Obj?j)?{?
?????????System.out.println(j.getClass().getSimpleName());
????}
????public?static?void?main(String[]?args)?{
????????//?TODO?自動(dòng)生成的方法存根
????????Test11A?test11a?=?new?Test11A();
????????Obj?obj?=?new?Sub1();?
????????Obj?obj2?=?new?Sub2();?
????????test11a.check(obj);
????????test11a.check(obj2);??
????}
}輸出: Sub1 Sub2
getName:
com.java.Obj.Sub1 com.java.Obj.Sub2
getDeclaredFields:獲得成員變量數(shù)組
public?class?Sub1?extends?Obj?{
????private??int?x;
????private??int?y;
????public?String?string;
????public??void?Test()
????{
????????System.out.println("Sub1?Test");
????}public?class?Test11A?????{
?????public?void???check(Obj?j)?{?
?????????System.out.println(j.getClass().getClassLoader());
????}
?????public?void???check2(Obj?j)?{?
????????????//?取得本類(lèi)的全部屬性
?????????Class?mclass?=null;
?????????mclass=?j.getClass();
????????Field[]?fields=?mclass.getDeclaredFields();
????????for?(int?i?=?0;?i?<?fields.length;?i++)?{
????????????Field?field?=?fields[i];
????????????Class??curClass=field.getType();?
????????????System.out.println(field.getModifiers()+","+curClass.getTypeName()+","+field.getName());
????????}
????}
????public?static?void?main(String[]?args)?{
????????//?TODO?自動(dòng)生成的方法存根
????????Test11A?test11a?=?new?Test11A();
????????Obj?obj?=?new?Sub1();?
????????Obj?obj2?=?new?Sub2();?
????????test11a.check2(obj);
????????test11a.check2(obj2);
????}
}輸出: 2,int,x 2,int,y 1,java.lang.String,string
訪問(wèn)修飾符是字符串,用java函數(shù)轉(zhuǎn)換:
public?void???check2(Obj?j)?{?
????????????//?取得本類(lèi)的全部屬性
?????????Class?mclass?=null;
?????????mclass=?j.getClass();
????????Field[]?fields=?mclass.getDeclaredFields();
????????for?(int?i?=?0;?i?<?fields.length;?i++)?{
????????????Field?field?=?fields[i];
?????????????Class??curClass=field.getType();
????????????System.out.println(Modifier.toString((field.getModifiers()))+","+curClass.getTypeName()+","+field.getName());
????????}
????}輸出: private,int,x private,int,y public,java.lang.String,string
public?void?check2(Obj?j)?{
????????//?取得本類(lèi)的全部屬性
????????Class?mclass?=?null;
????????mclass?=?j.getClass();
????????Field[]?fields?=?mclass.getDeclaredFields();
????????for?(int?i?=?0;?i?<?fields.length;?i++)?{
????????????Field?field?=?fields[i];
????????????Class?curClass?=?field.getType();
????????????System.out.println(
????????????????????Modifier.toString((field.getModifiers()))?+?","?+?curClass.getTypeName()?+?","?+?field.getName());
????????}
????}public?void?check3(Obj?j)?{
????//?取得本類(lèi)的全部方法
????Class?mclass?=?null;
????mclass?=?j.getClass();
????Method[]?marray?=?mclass.getDeclaredMethods();
????for?(int?i?=?0;?i?<?marray.length;?i++)?{
????????Method?field?=?marray[i];
?????????java.lang.reflect.Parameter[]?parameters=?field.getParameters();
?????????for?(int?k?=?0;?k?<?parameters.length;?k++)?{
????????????java.lang.reflect.Parameter?parameter?=?parameters[k];
????????????System.out.println(parameter.getType().getName());
????????}
?????????System.out.println(","+Modifier.toString(field.getModifiers())?+?"?"?+?field.getReturnType().getTypeName()?+?":"
????????????????+?field.getName());
????}
}????public?void?check4(Obj?j)?{
????????//?根據(jù)字符串調(diào)用對(duì)象方法
????????Class?mclass?=?null;
????????mclass?=?j.getClass();
????????try?{
????????????Method?method?=?mclass.getDeclaredMethod("Test2",String.class,int.class);
????????????method.invoke(j,"hi",555);
????????}?catch?(NoSuchMethodException?|?SecurityException?|?IllegalAccessException?|?IllegalArgumentException
????????????????|?InvocationTargetException?e)?{
????????????//?TODO?自動(dòng)生成的?catch?塊
????????????e.printStackTrace();
????????}
????}?void??check5(?)?throws?InstantiationException,?IllegalAccessException
????{
?????????//根據(jù)類(lèi)名生成對(duì)象實(shí)例
?????????try?{
????????????Class?mClass?=?Class.forName("com.java.Obj.Sub1");
????????????????try{
???????????????????Object?obj?=mClass.newInstance();
????????????????????Method??fucMethod=?mClass.getMethod("Test2",?String.class,int.class);
????????????????????fucMethod.invoke(obj,?"hello?",123);
????????????????}catch(Exception?e){
????????????????????e.printStackTrace();
????????????????}
????????}?catch?(ClassNotFoundException?e)?{
????????????//?TODO?自動(dòng)生成的?catch?塊
????????????e.printStackTrace();
????????}
????} 




