反射機制

反射機制java

下面咱們一塊兒來探討一下java的反射機制吧!功能太強大了,哈哈!web

 (一).  定義框架

  Reflection(反射)是Java被視爲動態語言的關鍵,反射機制容許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操做任意對象的內部屬性及方法。spa

1.1 主要功能代理

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

1.2 應用範圍code

  在web應用中不是不少,但反射機制是現在不少流行框架的實現基礎,包括Spring、Hibernate等。對象

1.3 注意blog

  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()方法返回的屬性列表將包括從父類繼承的公共屬性。

相關文章
相關標籤/搜索