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

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

黑馬程序員——反射機制

2019-11-14 15:08:22
字體:
來源:轉載
供稿:網友

------<a target="blank">java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

反射機制

下面我們一起來探討一下java的反射機制吧!功能太強大了,哈哈!

 (一).  定義

  Reflection(反射)是Java被視為動態語言的關鍵,反射機制允許程序在執行期借助于Reflection API取得任何類的內部信息,并能直接操作任意對象的內部屬性及方法。

1.1 主要功能

  • 在運行時判斷任意一個對象所屬的類
  • 在運行時構造任意一個類的對象
  • 在運行時判斷任意一個類所具有的成員變量和方法
  • 在運行時調用任意一個對象的方法
  • 生成動態代理

1.2 應用范圍

  在web應用中不是很多,但反射機制是如今很多流行框架的實現基礎,包括SPRing、Hibernate等。

1.3 注意

  Java通過Reflection API來完成反射機制,在java.lang.reflect包中有Field、Method、Constructor三個類分別用于描述類的屬性、方法、構造方法。

1.4 Constructor類 

  Constructor類用于表示類的構造方法,通過調用Class對象的getConstructor()方法就能獲取當前類的構造方法的集合。

1.4.1 Constructor類的方法

  String getName()————返回構造方法的名稱
  Class[] getParameterTypes()————返回當前構造方法的參數類型
  int getModifiers()————返回修飾符的整型標識

1.4.2 實踐

上代碼演示getConstructor()方法獲取指定類的構造方法

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Modifier; 5  6 public class ConstructorReflectionDemo { 7  8     public static void main(String[] args) { 9         String name = "java.util.Date";10         try {11             Class c1 = Class.forName(name);12             System.out.println("class " + name + "{");13             getConstructors(c1);14             System.out.println("}");15         } catch (ClassNotFoundException e) {16             System.out.println("Check name of the class!");17         }18     }19 20     public static void getConstructors(Class c1) {21         //返回聲明的所有構造方法包括私有的和受保護的,但不包括超類構造方法22         Constructor[] cons = c1.getDeclaredConstructors();23         for(int i=0;i<cons.length;i++){24             Constructor c = cons[i];25             //返回構造方法的名稱26             String name = c.getName();27             //通過Modifier類獲取修飾符28             System.out.print("   " + Modifier.toString(c.getModifiers()));29             System.out.print(" " + name + "(");30             //獲取構造方法的參數31             Class[] paramTypes = c.getParameterTypes();32             //打印構造方法的參數33             for(int j=0;j<paramTypes.length;j++){34                 if(j>0){35                     System.out.print(",");36                 }37                 System.out.print(paramTypes[j].getName());38             }39             System.out.println(")");40         }41     }42 }

1.5 Method類

  Method類提供關于類或接口上某個方法的信息,它是用來封裝反射類方法的一個類。

1.5.1 Method類方法

  String getName()————返回方法的名稱
  Class[] getParameterTypes()————返回當前方法的參數類型
  int getModifiers()————返回修飾符的整型標識
  Class getReturnType()————返回當前方法的返回類型

1.5.2 實踐

代碼演示getMethod()方法獲取指定類的所有的方法信息。

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Method; 4 import java.lang.reflect.Modifier; 5  6 public class MethodReflectionDemo { 7     public static void main(String[] args) { 8         String  name = "java.util.Date"; 9         try { 10             //返回指定字符串所代表的類的Class對象11             Class c1 = Class.forName(name);12             System.out.println("class " + name + "/n{");13             getMethods(c1);14             System.out.println("}");15         } catch (ClassNotFoundException e) {16             System.out.println("Check name of the Class");17         }18         System.exit(0);19     }20 21     public static void getMethods(Class c1) {22         //返回聲明的所有的方法包括私有的和受保護的,但不包括超類方法23         Method[] methods = c1.getDeclaredMethods();24         //返回公共方法,包括從父類繼承的公共方法25 //        Method[] methods1 = c1.getMethods();26         for(int i=0;i<methods.length;i++){27             //獲取單個method方法28             Method m = methods[i];29             //獲取當前方法的返回類型30             Class retype = m.getReturnType();31             //獲取方法名32             String name = m.getName();33             System.out.print("   " + Modifier.toString(m.getModifiers()));//修飾符34             System.out.print(" " + retype.getName() + " " + name + "(");//返回類型、方法名35             //打印參數信息36             Class[] paramtypes = m.getParameterTypes();37             for(int j=0;j<paramtypes.length;j++){38                 if(j>0){39                     System.out.print(",");40                 }41                 //打印參數名42                 System.out.print(paramtypes[j].getName());43             }44             System.out.println(");");45         }46     }47 }

1.6 Field類

  Field類提供有關類或接口的屬性信息

1.6.1 Field類的方法

  String getName()————返回方法的名稱
  Class[] getType()————返回當前屬性的參數列表

1.6.3 實踐

直接上代碼,通過代碼理解getField()方法用于獲取指定類或接口定義的屬性信息。

 1 package com.itsuper.p2.reflection; 2  3 import java.lang.reflect.Field; 4 import java.lang.reflect.Modifier; 5  6 public class FieldReflectionDemo { 7  8     public static void main(String[] args) { 9         String name = "java.util.Date";10         try {11             Class c1 = Class.forName(name);12             System.out.println("class " + name + "/n{");13             getFields(c1);14             System.out.println("}");15         } catch (ClassNotFoundException e) {16             System.out.println("Check name of the class !");17         }18     }19 20     public static void getFields(Class c1) {21         //返回聲明的所有的屬性包括私有的和受保護的,但不包括超類屬性22         Field[] fields= c1.getDeclaredFields();23         for(int i=0;i<fields.length;i++){24             Field field = fields[i];25             Class type = field.getType();26             String name = field.getName();27             System.out.print(" "+ Modifier.toString(field.getModifiers()));28             System.out.println(" " + type.getName() + " " + name + ";");29             30         }    31     }32 }

要注意:Field類的getDeclaredFields()方法將返回包括私有的和受保護的所有屬性定義,但不包括父類的屬性;getFields()方法返回的屬性列表將包括從父類繼承的公共屬性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 固始县| 灵台县| 阳江市| 潞西市| 嘉定区| 哈密市| 晴隆县| 纳雍县| 靖州| 乌拉特后旗| 温泉县| 景谷| 太原市| 天全县| 宁阳县| 威海市| 台南县| 武功县| 自治县| 荣昌县| 克山县| 石河子市| 武乡县| 廉江市| 叶城县| 河间市| 马山县| 宕昌县| 万荣县| 奉化市| 黎川县| 蒲江县| 德兴市| 家居| 嘉善县| 满城县| 兴业县| 大荔县| 盐池县| 壶关县| 聂拉木县|