Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
787
2022-05-30
反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。【翻譯于 官方文檔】
本篇將從以下幾個方面講述反射的知識:
calss的使用
方法的反射
構(gòu)造函數(shù)的反射
成員變量的反射
一、什么是class類
在面向?qū)ο蟮氖澜缋铮f物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只有java虛擬機才能new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達方式:
public?class?User{ } public?class?ClassTest{ User?u=new?User(); ?//方式1: ?Class?c1=User.class; //方式2: Class?c2=u.getClass(); //方式3: Class?c3=Class.forName("com.forezp.User"); //可以通過類的類型創(chuàng)建該類的實例對象 User?user=(User)c1.newInstance(); }
二、class類的動態(tài)加載
Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動態(tài)加載類。編譯時刻加載類是靜態(tài)加載、運行時刻加載類是動態(tài)加載類。
三、獲取方法信息
基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實例;可以通過get
ame();getSimpleName()獲取類的名稱。
Class?c1=String.class; Class?c2=int.class; Class?c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());
獲取類的所有方法,并打印出來:
public?static?void?printClassInfo(Object?object){ ????????Class?c=object.getClass(); ????????System.out.println("類的名稱:"+c.getName()); ????????/** ?????????*?一個成員方法就是一個method對象 ?????????*?getMethod()所有的?public方法,包括父類繼承的?public ?????????*?getDeclaredMethods()獲取該類所有的方法,包括private?,但不包括繼承的方法。 ?????????*/ ????????Method[]?methods=c.getMethods();//獲取方法 ????????//獲取所以的方法,包括private?,c.getDeclaredMethods(); ????????for(int?i=0;i public?class?ReflectTest?{ ????????public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????ClassUtil.printClassInfo(s); ????????} } 運行: 類的名稱:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() … 四、獲取成員變量的信息 也可以獲取類的成員變量信息 public?static?void?printFiledInfo(Object?o){ ????????Class?c=o.getClass(); ????????/** ?????????*?getFileds()獲取public ?????????*?getDeclaredFields()獲取所有 ?????????*/ ????????Field[]?fileds=c.getDeclaredFields(); ????????for(Field?f:fileds){ ????????????//獲取成員變量的類型 ????????????Class?filedType=f.getType(); ????????????System.out.println(filedType.getName()+"?"+f.getName()); ????????} ????} public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????//ClassUtil.printClassInfo(s); ????????????????ClassUtil.printFiledInfo(s); ????????} 運行: [C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash32 五、獲取構(gòu)造函數(shù)的信息 public?static?void?printConstructInfo(Object?o){ ????????Class?c=o.getClass(); ????????Constructor[]?constructors=c.getDeclaredConstructors(); ????????for?(Constructor?con:constructors){ ????????????System.out.print(con.getName()+"("); ????????????Class[]?typeParas=con.getParameterTypes(); ????????????for?(Class?class1:typeParas){ ????????????????System.out.print(class1.getName()+"?,"); ????????????} ????????????System.out.println(")"); ????????} ????} public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????//ClassUtil.printClassInfo(s); ????????????????//ClassUtil.printFiledInfo(s); ????????????????ClassUtil.printConstructInfo(s); ????????} 運行: java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.charset.Charset ,) java.lang.String([B ,java.lang.String ,) java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) java.lang.String(int ,int ,[C ,) java.lang.String([C ,boolean ,) java.lang.String(java.lang.StringBuilder ,) java.lang.String(java.lang.StringBuffer ,) … 六、方法反射的操作 獲取一個方法:需要獲取方法的名稱和方法的參數(shù)才能決定一個方法。 方法的反射操作: method.invoke(對象,參數(shù)列表); 舉個例子: class?A{ ????public?void?add(int?a,int?b){ ????????System.out.print(a+b); ????} ????public?void?toUpper(String?a){ ????????System.out.print(a.toUpperCase()); ????} } public?static?void?main(String[]?args)?{ ????????A?a=new?A(); ????????Class?c=a.getClass(); ????????try?{ ????????????Method?method=c.getMethod("add",new?Class[]{int.class,int.class}); ????????????//也可以?Method?method=c.getMethod("add",int.class,int.class); ????????????//方法的反射操作 ????????????method.invoke(a,10,10); ????????}catch?(Exception?e){ ????????????e.printStackTrace(); ????????} ????} 運行: 20 本篇文章已經(jīng)講解了java反射的基本用法, 它可以在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。 https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247484116&idx=1&sn=e8b0f7f169096e67bbc317214abc53ad&chksm=9bed23a6ac9aaab009fba143b4a8ca4a11beb40139eda679c3e06f34e1180c6a0fef92a0005f&scene=21#wechat_redirect Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。