通过反射获取类的类名,方法和内部成员变量


  1 package cn.lonecloud.reflect;
  2  
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Method;
  6  
  7 import org.junit.Test;
  8  
  9 public class ClassUtil {
 10     /**
 11      * 获取该类的信息
 12      * 比如他的类的类名和函数
 13      * @param obj
 14      */
 15     public static void getClassInfo(Object obj){
 16         //获取obj的类类型
 17         Class c1=obj.getClass();
 18         System.out.println("类的类型为"+c1.getName());
 19         System.out.println("类的类型为"+c1.getSimpleName());
 20         //获取类的类方法包括其父类的方法
 21         Method[] methods=c1.getMethods();
 22         System.out.println("该类的方法为");
 23         int c=0;
 24         for (int i = 0; i < methods.length; i++) {
 25             c++;
 26             Class returntype=methods[i].getReturnType();//获取该类的返回值
 27             System.out.print(returntype.getSimpleName()+" ");//打印返回值
 28             System.out.print(methods[i].getName()+"(");//打印方法名
 29             Class[] prams=methods[i].getParameterTypes();//获取参数的方法
 30             for (int j = 0; j < prams.length; j++) {
 31                 System.out.print(prams[j].getSimpleName()+"  ");//打印参数名
 32             }
 33             System.out.println(")");
 34         }
 35         System.out.println("利用getDeclaredMethods");
 36         //获取类的本类方法,不包含父类的方法可以获取他的类里面的所有方法
 37         Method[] methods1=c1.getDeclaredMethods();
 38         System.out.println("该类的方法为");
 39         int count=0;
 40         for (int i = 0; i < methods1.length; i++) {
 41             count++;
 42             Class returntype=methods1[i].getReturnType();//获取该类的返回值
 43             System.out.print(returntype.getSimpleName()+" ");//打印返回值
 44             System.out.print(methods1[i].getName()+"(");//打印方法名
 45             Class[] prams=methods1[i].getParameterTypes();//获取参数的方法
 46             for (int j = 0; j < prams.length; j++) {
 47                 System.out.print(prams[j].getSimpleName()+"  ");//打印参数名
 48             }
 49             System.out.println(")");
 50         }
 51         System.out.println(c+"  "+count);
 52     }
 53     /**
 54      * 获取构造方法
 55      * @param obj
 56      */
 57     public void getConMethod(Object obj){
 58         Class c=obj.getClass();
 59         //获取类的构造方法
 60         Constructor[] declaredConstructors = c.getDeclaredConstructors();
 61         for (Constructor constructor : declaredConstructors) {
 62             System.out.print(constructor.getName()+"(");
 63             Class[] parameterTypes = constructor.getParameterTypes();
 64             for (Class class1 : parameterTypes) {
 65                 System.out.print(class1.getName());
 66             }
 67         }
 68         System.out.println(")");
 69     }
 70     public void getClassFields(Object obj) {
 71         Class c=obj.getClass();
 72         //获取该类的成员变量
 73         Field[] declaredFields = c.getDeclaredFields();
 74         for (Field field : declaredFields) {
 75             //获取成员变量的类型
 76             System.out.print(field.getType().getName()+" ");
 77             //获取成员变量的名称
 78             System.out.println(field.getName());
 79         }
 80     }
 81     public void runClassMethod(Object obj) throws Exception{
 82         Class c1=obj.getClass();//获取类类型
 83         /*
 84          * c1.getDeclaredMethod("syso", parameterTypes)
 85          * 第一个是方法名,第二个为参数
 86          */
 87         Method m1=c1.getDeclaredMethod("de");
 88         m1.setAccessible(true);//设置这个方法的权限为public但是不会改变该方法的原有的权限
 89         /*
 90          * invoke(obj)对于指定的方法执行第一参数为这个对象,第二个为函数参数
 91          */
 92         System.out.println(m1.invoke(obj));
 93     }
 94     @Test
 95     public void test() throws Exception{
 96 //      String s="cewc";
 97 //      getClassInfo(s);
 98         word w=new word();
 99         getClassInfo(w);
100         getConMethod(w);
101         getClassFields(w);
102         runClassMethod(w);
103     }
104 }
package cn.lonecloud.reflect;   import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;   import org.junit.Test;   public class ClassUtil {     /**      * 获取该类的信息      * 比如他的类的类名和函数      * @param obj      */     public static void getClassInfo(Object obj){         //获取obj的类类型         Class c1=obj.getClass();         System.out.println("类的类型为"+c1.getName());         System.out.println("类的类型为"+c1.getSimpleName());         //获取类的类方法包括其父类的方法         Method[] methods=c1.getMethods();         System.out.println("该类的方法为");         int c=0;         for (int i = 0; i < methods.length; i++) {             c++;             Class returntype=methods[i].getReturnType();//获取该类的返回值             System.out.print(returntype.getSimpleName()+" ");//打印返回值             System.out.print(methods[i].getName()+"(");//打印方法名             Class[] prams=methods[i].getParameterTypes();//获取参数的方法             for (int j = 0; j < prams.length; j++) {                 System.out.print(prams[j].getSimpleName()+"  ");//打印参数名             }             System.out.println(")");         }         System.out.println("利用getDeclaredMethods");         //获取类的本类方法,不包含父类的方法可以获取他的类里面的所有方法         Method[] methods1=c1.getDeclaredMethods();         System.out.println("该类的方法为");         int count=0;         for (int i = 0; i < methods1.length; i++) {             count++;             Class returntype=methods1[i].getReturnType();//获取该类的返回值             System.out.print(returntype.getSimpleName()+" ");//打印返回值             System.out.print(methods1[i].getName()+"(");//打印方法名             Class[] prams=methods1[i].getParameterTypes();//获取参数的方法             for (int j = 0; j < prams.length; j++) {                 System.out.print(prams[j].getSimpleName()+"  ");//打印参数名             }             System.out.println(")");         }         System.out.println(c+"  "+count);     }     /**      * 获取构造方法      * @param obj      */     public void getConMethod(Object obj){         Class c=obj.getClass();         //获取类的构造方法         Constructor[] declaredConstructors = c.getDeclaredConstructors();         for (Constructor constructor : declaredConstructors) {             System.out.print(constructor.getName()+"(");             Class[] parameterTypes = constructor.getParameterTypes();             for (Class class1 : parameterTypes) {                 System.out.print(class1.getName());             }         }         System.out.println(")");     }     public void getClassFields(Object obj) {         Class c=obj.getClass();         //获取该类的成员变量         Field[] declaredFields = c.getDeclaredFields();         for (Field field : declaredFields) {             //获取成员变量的类型             System.out.print(field.getType().getName()+" ");             //获取成员变量的名称             System.out.println(field.getName());         }     }     public void runClassMethod(Object obj) throws Exception{         Class c1=obj.getClass();//获取类类型         /*          * c1.getDeclaredMethod("syso", parameterTypes)          * 第一个是方法名,第二个为参数          */         Method m1=c1.getDeclaredMethod("de");         m1.setAccessible(true);//设置这个方法的权限为public但是不会改变该方法的原有的权限         /*          * invoke(obj)对于指定的方法执行第一参数为这个对象,第二个为函数参数          */         System.out.println(m1.invoke(obj));     }     @Test     public void test() throws Exception{ //      String s="cewc"; //      getClassInfo(s);         word w=new word();         getClassInfo(w);         getConMethod(w);         getClassFields(w);         runClassMethod(w);     } }