国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

反射

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) { } }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广饶县| 赤壁市| 安徽省| 永宁县| 遂川县| 乌拉特中旗| 盐边县| 舟山市| 永修县| 新竹县| 普安县| 呼图壁县| 建宁县| 阿坝县| 斗六市| 尖扎县| 正宁县| 叶城县| 成安县| 无为县| 二连浩特市| 武平县| 台北县| 通榆县| 博罗县| 长岭县| 屏山县| 肃南| 辽阳市| 天台县| 长海县| 临猗县| 乌拉特中旗| 昌宁县| 汝阳县| 抚宁县| 韶关市| 新闻| 仪陇县| 陵水| 邻水|