亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

反射

2019-11-09 16:26:07
字體:
來源:轉載
供稿:網友

反射

獲得對象

public class ClassDemo1 { public static void main(String[] args) { /** * Foo的實例對象如何表示 * foo1就表示出來了 */ Foo foo1 = new Foo(); /** * Foo這個類也是一個實例對象,Class類的實例對象 * 如何表示 * 任何一個類都是Class類的實例對象 * 這個實例對象有三種表示方式 */ /** * [1] 任何一個類都有一個隱含的靜態成員變量Class */ Class c1 = Foo.class; /** * [2] 已知改類的對象,通過getClass方法 */ Class c2 = foo1.getClass(); /** * c1,c2表示了Foo類的類類型(class type) * 類也是對象,是Class類的實例對象 * 這個對象我們稱為改類的類類型 */ /** * 不管c1 or c2都代表了Foo類的類類型,一個類只可能是 * Class類的一個實例對象 */ System.out.PRintln(c1==c2); //true /** * [3] 通過類的全稱獲得 */ Class c3 = null; try { c3 = Class.forName("com.shixin.Foo"); } catch (ClassNotFoundException e) { System.out.println("類未找到"); } System.out.println(c2==c3); //true /** * 我們完全可以通過類的類類型創建該類的對象實例 * 需要有無參的構造方法 */ try { Foo foo = (Foo) c1.newInstance(); foo.print(); } catch (Exception e) { } }}class Foo{ void print(){ System.out.println("Foo:測試"); }}

動態加載

類是對象,類是java.lang.Class類的實例對象 這里寫圖片描述

package com.bean;// 創建一個協商好的接口public interface IWordAble { public void start();}package com.bean;// 實現接口public class Excel implements IwordAble{ @Override public void start() { System.out.println("啟動文檔"); System.out.println("結束文檔"); }}package com.bean;// 實現接口public class Word implements IwordAble{ // 成員變量 public int aaa; public int bbb; @Override public void start() { System.out.println("世界開始"); System.out.println("世界結束"); } public void cond(int n){ // 方法1 } public Word(){ // 無參構造方法 } public Word(int a){ // 有參構造方法 }}package com.shixin;import com.bean.IwordAble;public class ClassDemo2 { public static void main(String[] args) { /** * Class.forName("類的全稱"); * 不僅表示了類的類類型,還代表了動態加載類 * 編譯時刻加載類是靜態加載類 * 運行時刻加載類是動態加載類 */ /** * new 對象是靜態加載類 * 在編譯時刻就需要加載所有可能使用到的類 * 通過動態加載類可以解決這個問題 */ // Word w = new Word(); 沒有導包的話會報錯 try { // 使用動態加載 Class w = Class.forName("com.bean.Word"); // 通過類類型創建創建類對象 // 強轉成協商好的接口 IwordAble iw = (IwordAble) w.newInstance(); iw.start(); Class ex = Class.forName("com.bean.Excel"); // 通過類類型創建創建類對象 // 強轉成協商好的接口 IwordAble iex = (IwordAble) ex.newInstance(); iex.start(); } catch (Exception e) { } }}

這里寫圖片描述

工具類:

public class ClassUtils { /** * 打印類的信息 * 包括累的成員函數、成員變量 * @param obj 該對象所屬類的信息 */ public static void printClassMessage(Object obj){ /** * 要獲取類的信息 * 首先要獲取類的類類型 * 傳遞的是哪個子類的對象 * c就是該子類的類類型 */ Class c = obj.getClass(); /** * 獲取類的名稱 */ System.out.println("類的名稱是: "+c.getName()); /** * 獲取類的方法信息 */ printMethodMessage(c); /** * 獲取類的成員信息 */ printFieldMessage(c); /** * 獲取構造方法的信息 */ printConstructorMessage(c); }}

獲取方法信息

private static void printMethodMessage(Class c) { /** * Method類 方法的對象 * 一個成員方法就是一個Method類 * getMethods獲取的是所有public的方法,包括父類繼承而來的方法 * getDeclaredMethods獲取的該類自己聲明的方法 */ Method[] ms = c.getMethods(); Method[] ms2 = c.getDeclaredMethods(); for(int i=0; i<ms.length; i++){ // 得到方法的返回值類型 String returnType = ms[i].getReturnType().getName(); // 得到方法的名稱 String name = ms[i].getName(); // 獲取參數類型---得到的是參數列表的類型的類類型 Class[] parameterTypes = ms[i].getParameterTypes(); StringBuilder sb = new StringBuilder(); for (Class class1 : parameterTypes) { String p = class1.getName(); sb.append(p).append(" "); } String param = sb.toString(); System.out.println("該類的第"+i+"個方法是" +returnType+" "+name +"( "+param+")"); } }public class Test { public static void main(String[] args) { Word w = new Word(); ClassUtils.printClassMessage(w); }}

這里寫圖片描述

獲取成員信息

private static void printFieldMessage(Class c) { System.out.println("成員變量:"); /** * 成員變量也是對象 * java.lang.reflact.Field * Field類封裝了關于成員變量的操作 * getFields()方法獲取的是所有public的成員變量的信息 * getDeclaredFields()獲取的是該類自己聲明的成員變量的信息 * */ Field[] fs = c.getFields(); Field[] df = c.getDeclaredFields(); for (int i = 0; i < df.length; i++) { // 得到成員變量的類型的類類型 Class fieldType = df[i].getType(); String typeName = fieldType.getName(); // 得到成員變量的名稱 String fileName = df[i].getName(); System.out.println(typeName+" "+fileName); } }

獲取構造方法信息

private static void printConstructorMessage(Class c) { System.out.println("構造方法:"); /** * 構造方法也是對象 * java.lang.Constructor中封裝了構造方法的信息 * getConstructors獲取所有的公有構造方法 * getDeclaredConstructors獲得所有自己的構造方法 */ Constructor[] cs = c.getConstructors(); Constructor[] cs2 = c.getDeclaredConstructors(); for (int i = 0; i < cs2.length; i++) { String constructorName = cs2[i].getName(); // 獲取構造方法的參數列表 Class[] paramTypes = cs2[i].getParameterTypes(); StringBuffer sb = new StringBuffer(); for (Class class1 : paramTypes) { String typeName = class1.getName(); sb.append(typeName).append(" "); } System.out.println(constructorName +"(" +sb.toString()+")"); } }

這里寫圖片描述

反射的基本操作

package com.shixin;import java.lang.reflect.Method;public class MethodDemo1 { public static void main(String[] args) { /** * 反射的基本操作 */ /** * 如何獲取某個方法? * 方法的名稱和方法的參數列表此案能唯一決定某個方法 * 方法的反射操作 * method.invoke(對象,參數列表) */ // 獲取print(int,int)方法 /** * 要獲取一個方法就是獲取類的信息 * 獲取類的信息首先要獲取類的類類型 * 獲取方法 名稱和參數列表來決定 * getMethod獲取的是public的方法 * getDeclaredMethods獲取自己聲明的方法 * */ A a1 = new A(); Class c = a1.getClass(); try { Method m = c.getMethod("print", new Class[] { int.class, int.class }); //Method[] dm = c.getDeclaredMethods(); /** * 方法的反射操作 */ //a1.print(10, 20); 方法的反射操作指的是用m對象來進行方法調用 // 和a1.print的效果完全相同 // 方法如果沒有返回值返回null,有返回值返回具體的返回值 Object o = m.invoke(a1, new Object[]{10,20}); // 30 Method m2 = c.getMethod("print", new Class[] { String.class, String.class }); Object o2 = m2.invoke(a1, new Object[]{"QQq","DDD"}); // QQQ,ddd Method m3 = c.getMethod("print", new Class[]{}); m3.invoke(a1,new Class[]{}); } catch (Exception e) { } }}class A{ public void print(){ System.out.println("hello world"); } public void print(int a, int b){ System.out.println(a + b); } public void print(String a, String b){ System.out.println(a.toUpperCase()+","+b.toLowerCase()); }}

這里寫圖片描述

通過反射了解集合泛型的本質

public class MethodDemo2 { public static void main(String[] args) { ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<>(); list1.add("hello"); Class c1 = list.getClass(); Class c2 = list1.getClass(); System.out.println(c1==c2); // true /** * 反射的操作都是編譯之后的操作 * c1==c2結果返回true說明編譯之后集合的泛型是去泛型化的 * java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效 * 繞過編譯就無效了 * 驗證: 我們可以通過方法的反射來操作, 繞過編譯 * 繞過編譯就繞過了泛型 */ try { Method m = c2.getMethod("add", Object.class); m.invoke(list1,100); System.out.println("此時list的長度為:"+list1.size()); // 2 System.out.println(list1); // [hello, 100]// for (String string : list1) {// System.out.println(string);// } // 現在就不能這樣遍歷了 } catch (Exception e) { } }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性理论片在线观看片免费| 激情亚洲一区二区三区四区| 亚洲高清一区二| 亚洲精品视频二区| 国产精品69精品一区二区三区| 成人乱色短篇合集| 国产精品扒开腿做爽爽爽视频| 日韩天堂在线视频| 日韩av网站在线| 久久久久久com| 亚洲成人av片| 日本一区二区在线播放| 精品女厕一区二区三区| 欧美成人激情在线| 97人人做人人爱| 国产精品欧美激情在线播放| 国产精品美女主播| 国产一区二区三区精品久久久| 国产成人精彩在线视频九色| 一区二区成人精品| 亚洲国产免费av| 国产精品最新在线观看| 国产999精品久久久| 欧美日韩视频免费播放| 97香蕉久久夜色精品国产| 欧美日本高清一区| 亚洲天堂男人的天堂| 97色在线视频| 亚洲深夜福利视频| 欧美精品videosex牲欧美| 国产精品美女呻吟| 久久久97精品| 欧美成人手机在线| 国产精品久久久久久av下载红粉| 91成人在线播放| 日韩在线欧美在线国产在线| 亚洲一区二区三区乱码aⅴ| 欧美理论片在线观看| 日韩网站免费观看| 91香蕉国产在线观看| 久久久久久国产免费| 国产精品日韩在线播放| 国产精品国产自产拍高清av水多| 69国产精品成人在线播放| 日韩欧美视频一区二区三区| 欧美乱大交xxxxx| 欧美诱惑福利视频| 欧美黄色免费网站| 欧美激情欧美激情在线五月| 原创国产精品91| 日本午夜人人精品| 久久福利网址导航| 欧美一级电影久久| 亚洲最大成人网色| 精品国产1区2区| 亚洲人午夜精品免费| 国产成人精品综合久久久| 疯狂做受xxxx高潮欧美日本| 日本最新高清不卡中文字幕| 亚洲欧美中文在线视频| 欧美www视频在线观看| 九色精品免费永久在线| 97精品一区二区三区| 91精品国产综合久久久久久蜜臀| 精品国产31久久久久久| 久久综合久中文字幕青草| 久久成人这里只有精品| 亚洲精品一区在线观看香蕉| 欧美最猛性xxxxx免费| 日韩第一页在线| 欧美激情视频免费观看| 久久久久国产精品免费网站| 精品国产乱码久久久久久天美| 日韩视频在线免费观看| 亚洲精品99久久久久中文字幕| 亚洲欧美中文字幕| 最新69国产成人精品视频免费| 在线观看精品自拍私拍| 精品久久中文字幕| 午夜精品在线视频| 日韩av黄色在线观看| 国语自产偷拍精品视频偷| 91国偷自产一区二区三区的观看方式| 久久久久国产精品免费| 日韩午夜在线视频| 欧美在线免费视频| 国产成人精品免高潮费视频| 久久久久久国产精品久久| 亚洲一区二区三区成人在线视频精品| 日本精品久久中文字幕佐佐木| 国产成人黄色av| 国产视频精品自拍| 欧美性高跟鞋xxxxhd| 国产999精品久久久影片官网| 黑人与娇小精品av专区| 国产ts一区二区| 亚洲电影免费观看高清完整版在线| 欧美一级片在线播放| 久久精品视频在线| 久久久免费精品视频| 精品国产乱码久久久久酒店| 久久精品久久精品亚洲人| www国产精品com| 日韩欧美在线字幕| 97碰碰碰免费色视频| 欧美性猛交xxx| 日韩欧美视频一区二区三区| 日韩中文字幕在线视频播放| 亚洲欧美制服另类日韩| 中文.日本.精品| 日韩在线观看高清| 亚州精品天堂中文字幕| 国产欧美日韩免费| 中国日韩欧美久久久久久久久| 日韩精品视频观看| 午夜精品国产精品大乳美女| 欧美激情视频一区二区三区不卡| 欧美日韩成人网| 欧美性猛交丰臀xxxxx网站| 51色欧美片视频在线观看| 欧美一区二区视频97| 国产精品jvid在线观看蜜臀| 国产主播喷水一区二区| 欧美xxxx18性欧美| 欧美激情高清视频| 国产精品久久久久久久久久久新郎| 国产成人精品在线观看| 久久久久久久电影一区| 国产91网红主播在线观看| 亚洲高清一区二| 欧美三级免费观看| 精品免费在线视频| 欧美第一黄网免费网站| 中文字幕亚洲欧美| 久久久久久久成人| 久久艹在线视频| 欧美日韩国产中字| 欧美性猛交xxxx| 国产男女猛烈无遮挡91| 久久精品国产亚洲精品2020| 欧美日韩激情美女| 日本不卡高字幕在线2019| 欧美日韩中文字幕日韩欧美| 青青青国产精品一区二区| 伊人久久精品视频| 中文字幕日韩在线视频| 久久精品男人天堂| 亚洲免费视频在线观看| 久久精品视频免费播放| 热99久久精品| 精品国产依人香蕉在线精品| 日韩一区二区三区在线播放| 91九色国产视频| 久热精品视频在线观看| 亚洲欧美综合精品久久成人| 97视频在线观看免费高清完整版在线观看| 亚洲第一精品电影| 亚洲视频在线视频| 国产视频亚洲精品| 欧美精品在线网站| 国产一区二区三区精品久久久| 一二美女精品欧洲| 日韩电影中文字幕在线观看| 国产精品视频xxxx|