本文接上文「Class類的使用」,以編寫一個用來獲取類的信息(成員函數、成員變量、構造函數)的工具類來說解"反射之獲取類的信息"html
一、獲取成員函數信息java
1 /** 2 * 獲取成員函數信息 3 * @param obj 4 */ 5 public static void printClassMethodMessage(Object obj){ 6 //獲取類的信息 獲取類的類類型 7 Class c = obj.getClass(); 8 //獲取類的名稱 9 System.out.println("類的名稱是:" + c.getName()); 10 /** 11 * Methods類,方法對象 12 * 一個成員方法就是一個Method對象 13 * getMethods()方法是獲取全部public的函數,包括父類繼承而來 14 * getDeclaredMethods()獲取的是全部該類本身聲明的方法,不問訪問權限 15 */ 16 // Method [] ms = c.getMethods(); 17 Method [] ms = c.getDeclaredMethods(); 18 for (Method m : ms) { 19 //獲得方法返回值的類類型 20 Class returnType = m.getReturnType(); 21 System.out.print(returnType.getName() + " "); 22 //獲得方法名稱 23 System.out.print(m.getName() + "("); 24 //獲取參數類型(獲得的是參數列表的類型的類類型) 25 Class[] paramTypes = m.getParameterTypes(); 26 for (Class paramType : paramTypes) { 27 System.out.print(paramType.getName()+","); 28 } 29 System.out.println(")"); 30 } 31 }
二、獲取成員變量信息ide
1 /** 2 * 獲取成員變量信息 3 * @param obj 4 */ 5 public static void printClassFieldMessage(Object obj) { 6 Class c = obj.getClass(); 7 /** 8 * 成員變量也是對象 9 * Field類封裝了關於成員變量的操做 10 * getFields()獲取的是全部的public的成員變量信息 11 * getDeclaredFields()獲取的是該類本身聲明的成員變量信息 12 */ 13 // Field [] fs = c.getFields(); 14 Field[] fs = c.getDeclaredFields(); 15 for (Field f : fs) { 16 //獲得成員變量的類型的類類型 17 Class fieldType = f.getType(); 18 String typeName = fieldType.getName(); 19 //獲得成員變量的名稱 20 String fieldName = f.getName(); 21 System.out.println(typeName+" "+fieldName); 22 } 23 }
三、獲取構造函數信息函數
1 public static void printConMessage(Object obj){ 2 Class c = obj.getClass(); 3 /** 4 * 構造函數也是對象 5 * java.lang.Constructor封裝了構造函數的信息 6 * getConstructors()獲取全部的public構造函數 7 * getDeclaredConstructors()獲取全部的構造函數 8 */ 9 // Constructor[] cs = c.getConstructors(); 10 Constructor[] cs = c.getDeclaredConstructors(); 11 for (Constructor constructor : cs) { 12 System.out.print(constructor.getName()+"("); 13 //獲取構造函數的參數列表,獲得的是參數列表的類類型 14 Class[] paramTypes = constructor.getParameterTypes(); 15 for (Class paramType : paramTypes) { 16 System.out.print(paramType.getName()+","); 17 } 18 System.out.println(")"); 19 } 20 }
四、工具類代碼工具
1 package com.format.util; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 /** 8 * 打印類的信息,成員函數、成員變量 9 * Created by Format on 2017/6/3. 10 */ 11 public class ClassUtil { 12 13 /** 14 * 獲取成員函數信息 15 * @param obj 16 */ 17 public static void printClassMethodMessage(Object obj){ 18 //獲取類的信息 獲取類的類類型 19 Class c = obj.getClass(); 20 //獲取類的名稱 21 System.out.println("類的名稱是:" + c.getName()); 22 /** 23 * Methods類,方法對象 24 * 一個成員方法就是一個Method對象 25 * getMethods()方法是獲取全部public的函數,包括父類繼承而來 26 * getDeclaredMethods()獲取的是全部該類本身聲明的方法,不問訪問權限 27 */ 28 // Method [] ms = c.getMethods(); 29 Method [] ms = c.getDeclaredMethods(); 30 for (Method m : ms) { 31 //獲得方法返回值的類類型 32 Class returnType = m.getReturnType(); 33 System.out.print(returnType.getName() + " "); 34 //獲得方法名稱 35 System.out.print(m.getName() + "("); 36 //獲取參數類型(獲得的是參數列表的類型的類類型) 37 Class[] paramTypes = m.getParameterTypes(); 38 for (Class paramType : paramTypes) { 39 System.out.print(paramType.getName()+","); 40 } 41 System.out.println(")"); 42 } 43 } 44 45 /** 46 * 獲取成員變量信息 47 * @param obj 48 */ 49 public static void printClassFieldMessage(Object obj) { 50 Class c = obj.getClass(); 51 /** 52 * 成員變量也是對象 53 * Field類封裝了關於成員變量的操做 54 * getFields()獲取的是全部的public的成員變量信息 55 * getDeclaredFields()獲取的是該類本身聲明的成員變量信息 56 */ 57 // Field [] fs = c.getFields(); 58 Field[] fs = c.getDeclaredFields(); 59 for (Field f : fs) { 60 //獲得成員變量的類型的類類型 61 Class fieldType = f.getType(); 62 String typeName = fieldType.getName(); 63 //獲得成員變量的名稱 64 String fieldName = f.getName(); 65 System.out.println(typeName+" "+fieldName); 66 } 67 } 68 69 /** 70 * 獲取構造函數信息 71 * @param obj 72 */ 73 public static void printConMessage(Object obj){ 74 Class c = obj.getClass(); 75 /** 76 * 構造函數也是對象 77 * java.lang.Constructor封裝了構造函數的信息 78 * getConstructors()獲取全部的public構造函數 79 * getDeclaredConstructors()獲取全部的構造函數 80 */ 81 // Constructor[] cs = c.getConstructors(); 82 Constructor[] cs = c.getDeclaredConstructors(); 83 for (Constructor constructor : cs) { 84 System.out.print(constructor.getName()+"("); 85 //獲取構造函數的參數列表,獲得的是參數列表的類類型 86 Class[] paramTypes = constructor.getParameterTypes(); 87 for (Class paramType : paramTypes) { 88 System.out.print(paramType.getName()+","); 89 } 90 System.out.println(")"); 91 } 92 } 93 94 }