-
JAVA-Reflect專題
Class類的使用
方法的反射
成員變量的反射
構(gòu)造函數(shù)的反射
Java類加載機制
查看全部 -
萬事萬物皆對象。
類也是對象,類是java.lang.Class類的實例對象。
Class c1 = Foo.class;
c1是Foo類的類類型(Class Type)
Foo foo1 = (Foo)c1.newInstance();
可以通過類的類類型去創(chuàng)建類的實例對象
前提:該類有無參構(gòu)造函數(shù),newInstance方法會通過無參構(gòu)造函數(shù)去生成類的實例對象。
查看全部 -
編譯時刻加載類是靜態(tài)加載類,運行時刻加載類是動態(tài)加載類
查看全部 -
Foo?foo1=new?Foo(); Class?c1=Foo.class; //任何一個類都有一個隱含的靜態(tài)成員變量 Class?c2=fool.getClass(); Class?c3=null; c3=Class.foeName("com.imooc.reflect.Foo");
1.萬事萬物皆對象,類也是對象,是Class類的實例對象,這個對象我們稱為該類的類類型。
2.Fool類的對象就是foo1,F(xiàn)ool類的類類型就是Class的對象
3.c1==c2==c3
4.
//通過類的類類型創(chuàng)建該類的對象實例
Foo foo=(Foo)c1.newInstance();
查看全部 -
//獲取類對象的三種形式
//第一種
Student s = new Student();
Class c1 = s.getClass();
//第二種
Class? c2 = Student.class();
//第三種
Class c3? = Class.forName("package.Student");
查看全部 -
獲取類對象的三種方法
Foo?f?=?new?Foo(); //?第一種 Class?c1?=?f.getClass(); //?第二種 Class?c2?=?Foo.class; //?第三種(包名+類名) Class?c3?=?Class.forName("package.Foo");
使用類類型獲取該類的對象
Foo?f?=?(Foo)c1.newInstance();
查看全部 -
Java 方法反射的操作
1、如何獲取某個方法
方法名稱和方法參數(shù)列表才能唯一決定某個方法
先獲取該類的類類型
A a1 = new? A();
Class c = a1.getClass();
再通過類類型獲取具體的方法
c.getMethod("print",int.class,int.class);
c.getMethod("print",new Object[]{int.class,int.class});
2、方法反射的操作
Object obj = method.invoke(對象,參數(shù)列表);
Object obj = m.invoke(a1,10,20);
Object obj = m.invoke(a1,new Object[]{10,20});
如果該方法沒有返回值,則返回null,如果有返回值則返回具體的值
查看全部 -
1、Class類
? 1) 在面向?qū)ο蟮氖澜缋?,萬事萬物皆對象。(java語言中,靜態(tài)的成員、普通數(shù)據(jù)類型除外)
? ?類是不是對象呢?類是(哪個類的對象呢?)誰的對象呢?
???類是對象,類是java.lang.Class類的實例對象? 2 )Class.forName("類的全稱")不僅表示了,類的類類型,還代表了動態(tài)加載類,請大家區(qū)分編譯、運行加載類
? ?編譯時刻加載類是靜態(tài)加載類、運行時刻加載類是動態(tài)加載類? 3)基本的數(shù)據(jù)類型、void關(guān)鍵字都存在類類型? ?
2、方法的反射
??1)如何獲取某個方法
? ?方法的名稱和方法的參數(shù)列表才能唯一決定某個方法? 2)方法反射的操作
???method.invoke(對象,參數(shù)列表)? 3)為什么要用方法的反射
? ?指定方法名稱調(diào)用方法,舉個實際應(yīng)用的案例? ---->通過標準JavaBean的屬性名獲取其屬性值
? ?BeanUtil類? ?import?java.lang.reflect.Method; public?class?BeanUtil?{ ????/** ?????*?根據(jù)標準javaBean對象的屬性名獲取其屬性值 ?????*? ?????*?@param?obj ?????*?@param?propertyName ?????*?@return ?????*/ ?????public?static?Object?getValueByPropertyName(Object?obj,?String?propertyName)?{ ?????????//?1.根據(jù)屬性名稱就可以獲取其get方法 ?????????String?getMethodName?=?"get"?+?propertyName.substring(0,?1).toUpperCase()?+?propertyName.substring(1); ?????????//2.獲取方法對象 ?????????Class?c?=?obj.getClass(); ?????????try?{ ?????????????????//get方法都是public的且無參數(shù) ?????????????????Method?m=?c.getMethod(getMethodName); ?????????????????//3?通過方法的反射操作方法 ?????????????????Object?value?=?m.invoke(obj); ?????????????????return?value; ?????????????}?catch?(Exception?e)?{ ?????????????????e.printStackTrace(); ?????????????????return?null; ?????????????} ?????????} ?????}
? ClassUtil?
import?java.lang.reflect.Constructor; import?java.lang.reflect.Field;i mport?java.lang.reflect.Method; ????public?class?ClassUtil?{ ????/** *?打印類的信息,包括類的成員函數(shù)、成員變量(只獲取成員函數(shù)) ??????*?@param?obj?該對象所屬類的信息 ??????*/ ?????public?static?void?printClassMethodMessage(Object?obj){ ?????????//要獲取類的信息??首先要獲取類的類類型 ?????????Class?c?=?obj.getClass();//傳遞的是哪個子類的對象??c就是該子類的類類型 ?????????//獲取類的名稱 ?????????System.out.println("類的名稱是:"+c.getName()); ?????????/** ??????????*?Method類,方法對象 ??????????*?一個成員方法就是一個Method對象 ??????????*?getMethods()方法獲取的是所有的public的函數(shù),包括父類繼承而來的 ??????????*?getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權(quán)限 ??????????*/ ??????????Method[]?ms?=?c.getMethods();//c.getDeclaredMethods() ??????????for(int?i?=?0;?i?<?ms.length;i++){ ??????????????//得到方法的返回值類型的類類型 ??????????????Class?returnType?=?ms[i].getReturnType(); ??????????????System.out.print(returnType.getName()+"?"); ??????????????//得到方法的名稱 ??????????????System.out.print(ms[i].getName()+"("); ??????????????//獲取參數(shù)類型--->得到的是參數(shù)列表的類型的類類型 ??????????????Class[]?paramTypes?=?ms[i].getParameterTypes(); ??????????????for?(Class?class1?:?paramTypes)?{ ??????????????????System.out.print(class1.getName()+","); ??????????????} ??????????????System.out.println(")"); ???????????} ??????????}???? ??????????/**????? ???????????*?獲取成員變量的信息????? ???????????*?@param?obj????? ???????????*/ ???????????public?static?void?printFieldMessage(Object?obj)?{ ???????????????Class?c?=?obj.getClass(); ???????????????/** ????????????????*?成員變量也是對象 ????????????????*?java.lang.reflect.Field ????????????????*?Field類封裝了關(guān)于成員變量的操作 ????????????????*?getFields()方法獲取的是所有的public的成員變量的信息 ????????????????*?getDeclaredFields獲取的是該類自己聲明的成員變量的信息 ????????????????*/ ????????????????//Field[]?fs?=?c.getFields(); ????????????????Field[]?fs?=?c.getDeclaredFields(); ????????????????for?(Field?field?:?fs)?{ ????????????????????//得到成員變量的類型的類類型 ????????????????????Class?fieldType?=?field.getType(); ????????????????????String?typeName?=?fieldType.getName(); ????????????????????//得到成員變量的名稱 ????????????????????String?fieldName?=?field.getName(); ????????????????????System.out.println(typeName+"?"+fieldName); ????????????????} ????????????} ????????????/** ?????????????*?打印對象的構(gòu)造函數(shù)的信息 ?????????????*?@param?obj ?????????????*/ ?????????????public?static?void?printConMessage(Object?obj){ ?????????????????Class?c?=?obj.getClass(); ?????????????????/** ??????????????????*?構(gòu)造函數(shù)也是對象 ??????????????????*?java.lang.?Constructor中封裝了構(gòu)造函數(shù)的信息 ??????????????????*?getConstructors獲取所有的public的構(gòu)造函數(shù) ??????????????????*?getDeclaredConstructors得到所有的構(gòu)造函數(shù) ??????????????????*/ ??????????????????//Constructor[]?cs?=?c.getConstructors(); ??????????????????Constructor[]?cs?=?c.getDeclaredConstructors(); ??????????????????for?(Constructor?constructor?:?cs)?{ ??????????????????????System.out.print(constructor.getName()+"("); ??????????????????????//獲取構(gòu)造函數(shù)的參數(shù)列表--->得到的是參數(shù)列表的類類型 ??????????????????????Class[]?paramTypes?=?constructor.getParameterTypes(); ??????????????????????for?(Class?class1?:?paramTypes)?{ ??????????????????????????System.out.print(class1.getName()+","); ??????????????????????} ??????????????????????System.out.println(")"); ??????????????????} ??????????????} ??????????}
?4)通過Class,Method來認識泛型的本質(zhì)
ArrayList?list?=?new?ArrayList(); ArrayList<String>?list1?=?new?ArrayList<String>(); list1.add("hello"); Class?c1?=?list.getClass(); Class?c2?=?list1.getClass(); System.out.println(c1?==?c2);?//?結(jié)果true?——反射的操作都是編譯之后的操作 //?c1==c2結(jié)果返回true說明編譯之后集合的泛型是去泛型化的
查看全部 -
int.class//int的類類型 String.class//String的類類型 .getName()//類的名稱 .getSimpleName()//不帶包名的類名 void關(guān)鍵字都存在類類型 class類的基本API Class?c?=?obj.getClass();//傳遞的是哪個子類的對象?c就是該子類的類類型
查看全部 -
11111查看全部
-
反射可以繞過編譯
查看全部 -
獲取類對象的三種方法:
Foo?f?=?new?Foo(); Class?c1?=?f.getClass();
Class?c2?=?Foo.class;
Class?c3?=?Class.forName("package.Foo");
使用類類型獲取該類的對象
Foo?f?=?(Foo)c1.newInstance();
查看全部 -
Ok查看全部
-
在編譯時刻加載類是靜態(tài)類加載,在運行時刻加載類是動態(tài)類加載。范型是防止錯誤輸入,在編譯之后是去范型的。查看全部
-
new對象就是靜態(tài)加載類,在編譯時刻即加載所有可能用到的對象。查看全部
舉報