------<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()方法返回的屬性列表將包括從父類繼承的公共屬性。
新聞熱點
疑難解答