麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

反射

2019-11-09 16:26:07
字體:
供稿:網(wǎng)友

反射

獲得對象

public class ClassDemo1 { public static void main(String[] args) { /** * Foo的實(shí)例對象如何表示 * foo1就表示出來了 */ Foo foo1 = new Foo(); /** * Foo這個(gè)類也是一個(gè)實(shí)例對象,Class類的實(shí)例對象 * 如何表示 * 任何一個(gè)類都是Class類的實(shí)例對象 * 這個(gè)實(shí)例對象有三種表示方式 */ /** * [1] 任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量Class */ Class c1 = Foo.class; /** * [2] 已知改類的對象,通過getClass方法 */ Class c2 = foo1.getClass(); /** * c1,c2表示了Foo類的類類型(class type) * 類也是對象,是Class類的實(shí)例對象 * 這個(gè)對象我們稱為改類的類類型 */ /** * 不管c1 or c2都代表了Foo類的類類型,一個(gè)類只可能是 * Class類的一個(gè)實(shí)例對象 */ 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 /** * 我們完全可以通過類的類類型創(chuàng)建該類的對象實(shí)例 * 需要有無參的構(gòu)造方法 */ try { Foo foo = (Foo) c1.newInstance(); foo.print(); } catch (Exception e) { } }}class Foo{ void print(){ System.out.println("Foo:測試"); }}

動(dòng)態(tài)加載

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

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

這里寫圖片描述

工具類:

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

獲取方法信息

private static void printMethodMessage(Class c) { /** * Method類 方法的對象 * 一個(gè)成員方法就是一個(gè)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(); // 獲取參數(shù)類型---得到的是參數(shù)列表的類型的類類型 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+"個(gè)方法是" +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類封裝了關(guān)于成員變量的操作 * 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); } }

獲取構(gòu)造方法信息

private static void printConstructorMessage(Class c) { System.out.println("構(gòu)造方法:"); /** * 構(gòu)造方法也是對象 * java.lang.Constructor中封裝了構(gòu)造方法的信息 * getConstructors獲取所有的公有構(gòu)造方法 * getDeclaredConstructors獲得所有自己的構(gòu)造方法 */ Constructor[] cs = c.getConstructors(); Constructor[] cs2 = c.getDeclaredConstructors(); for (int i = 0; i < cs2.length; i++) { String constructorName = cs2[i].getName(); // 獲取構(gòu)造方法的參數(shù)列表 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) { /** * 反射的基本操作 */ /** * 如何獲取某個(gè)方法? * 方法的名稱和方法的參數(shù)列表此案能唯一決定某個(gè)方法 * 方法的反射操作 * method.invoke(對象,參數(shù)列表) */ // 獲取print(int,int)方法 /** * 要獲取一個(gè)方法就是獲取類的信息 * 獲取類的信息首先要獲取類的類類型 * 獲取方法 名稱和參數(shù)列表來決定 * 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對象來進(jìn)行方法調(diào)用 // 和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()); }}

這里寫圖片描述

通過反射了解集合泛型的本質(zhì)

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結(jié)果返回true說明編譯之后集合的泛型是去泛型化的 * java中集合的泛型,是防止錯(cuò)誤輸入的,只在編譯階段有效 * 繞過編譯就無效了 * 驗(yàn)證: 我們可以通過方法的反射來操作, 繞過編譯 * 繞過編譯就繞過了泛型 */ try { Method m = c2.getMethod("add", Object.class); m.invoke(list1,100); System.out.println("此時(shí)list的長度為:"+list1.size()); // 2 System.out.println(list1); // [hello, 100]// for (String string : list1) {// System.out.println(string);// } // 現(xiàn)在就不能這樣遍歷了 } catch (Exception e) { } }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 操碰在线视频 | 免费人成在线播放 | 久久久久久久一区 | 亚洲人成网站在e线播放 | 黄视频网站免费观看 | 久久精品中文字幕一区二区 | 激情福利视频 | 欧美黄色免费视频 | 成品片a免人视频 | 91情侣在线偷精品国产 | 亚洲午夜久久久精品一区二区三区 | av观看网站| 露脸各种姿势啪啪的清纯美女 | 黄色一级片免费在线观看 | 91亚洲免费视频 | 91成人免费版 | 成人黄色短视频在线观看 | 欧美亚洲国产一区二区三区 | 极品国产91在线网站 | 请播放一级毛片 | 97久久人人超碰caoprom | 中文字幕国产一区 | av成人一区二区 | 91在线视频免费观看 | 国产一区二区三区四区五区精品 | 免费国产一级淫片 | 亚洲四播房| 黄色片网站在线免费观看 | 国产一区日韩一区 | 蜜桃一本色道久久综合亚洲精品冫 | 毛片视频网站在线观看 | 一级视频在线播放 | 久久av喷吹av高潮av懂色 | 成年毛片 | 精品av在线播放 | 特级毛片a级毛片100免费 | 久久国产精品一区 | 久久久久久中文字幕 | 男男啪羞羞视频网站 | 久久久久国产精品久久久久 | 好吊色欧美一区二区三区四区 |