Java 通过反射获取类的信息(成员变量,成员方法,构造方法)

直接看代码
  1. package practive.Reflect;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. /**
  6.  * 获得类的信息(成员方法,成员变量,构造方法)
  7.  * @Author: 言曌
  8.  * @Date: 2017/11/16
  9.  * @Time: 下午10:06
  10.  */
  11. public class ClassUtil {
  12.     public static void printMrthodMessage(Object obj) {
  13.         //获取类的信息,首先要获取类的类类型
  14.         Class c = obj.getClass();//传递是哪个子类的对象,c 就是该子类的类类型
  15.         //获取类的名称
  16.         System.out.println("类的名称:"+c.getName());
  17.         /**
  18.          * Method类,方法对象
  19.          * 一个成员方法是一个Method对象
  20.          * getMethods()方法获取的是所有public的函数,包括继承而来的
  21.          * getDeclaredMethods()获取的是所有该类的声明的方法,不问访问权限
  22.          */
  23.         Method[] ms = c.getMethods();
  24.         for(int i=0;i<ms.length;i++) {
  25.             //获得方法的返回值类型的类类型
  26.             Class returnType = ms[i].getReturnType();
  27.             System.out.print(returnType+" ");
  28.             //得到方法名
  29.             System.out.print(ms[i].getName()+"(");
  30.             //获得参数类型-->得到的是参数列表的类型的类类型
  31.             Class[] paramTypes = ms[i].getParameterTypes();
  32.             for(Class class1 : paramTypes) {
  33.                 System.out.print(class1.getName()+",");
  34.             }
  35.             System.out.print(")");
  36.             System.out.println();
  37.         }
  38.     }
  39.     public static void printFieldMessage(Object obj) {
  40.         Class c = obj.getClass();
  41.         /**
  42.          * 成员变量也是对象
  43.          * java.lang.reflect.Field
  44.          * Field类封装了关于成员变量的操作
  45.          * getFields()方法获取的是所有的public的成员变量的信息
  46.          * getDeclaredFields()获取的是该类自己声明的成员变量的信息
  47.          */
  48.         //Field[] fs = c.getFields();
  49.         Field[] fs = c.getDeclaredFields();
  50.         for(Field field : fs) {
  51.             //得到成员变量的类型的类类型
  52.             Class fieldType = field.getType();
  53.             String typeName = fieldType.getTypeName();
  54.             //获得成员变量的名称
  55.             String fieldName = field.getName();
  56.             System.out.println(typeName+" "+fieldName);
  57.         }
  58.     }
  59.     public static void printConMessage(Object obj) {
  60.         Class c = obj.getClass();
  61.         /**
  62.          * 构造函数也是对象
  63.          * java.lang.Constructor中封装了构造函数的信息
  64.          * getConstructors获取所有的public的构造函数
  65.          * getDeclaredConstuctors()得到所有的构造函数
  66.          */
  67.         //Constructor[] cs = c.getConstructors();
  68.         Constructor[] cs = c.getDeclaredConstructors();
  69.         for(Constructor constructor:cs) {
  70.             System.out.print(constructor.getName()+"(");
  71.             //获取构造函数的参数列表-->得到的是参数列表的类类型
  72.             Class[] paramTypes = constructor.getParameterTypes();
  73.             for(Class class1:paramTypes) {
  74.                 System.out.print(class1.getName()+",");
  75.             }
  76.             System.out.print(")");
  77.             System.out.println();
  78.         }
  79.     }
  80. }
  然后写一个类来测试
  1. package practive.Reflect;
  2. /**
  3.  * @Author: 言曌
  4.  * @Date: 2017/11/16
  5.  * @Time: 下午10:30
  6.  */
  7. public class ClassDemo2 {
  8.     public static void main(String args[]) {
  9.         ClassUtil.printMethodMessage("hello");
  10.         ClassUtil.printMethodMessage(new Integer(1));
  11.         //ClassUtil.printFieldMessage("hello");
  12.         ClassUtil.printFieldMessage(new Integer(1));
  13.         //ClassUtil.printConMessage("hello");
  14.         ClassUtil.printConMessage(new Integer(1));
  15.     }
  16. }
   

发表评论

目前评论:1