Java反射之解析目标类的成员信息

package com.jadyer.reflection;       import Java.lang.reflect.Constructor;    import java.lang.reflect.Field;    import java.lang.reflect.Method;    import java.lang.reflect.Modifier;    import java.util.Scanner;       /**    * 解析目标类的成员信息    */   public class ParseTargetClassMember {        public static void main(String[] args) {            System.out.println("请输入类型名称:"); //给定的必须是完整的包层次和类名,如java.lang.String            String className = new Scanner(System.in).next(); //返回一个字符串的形式的含有完整包名的类名            System.out.println("当前类型:" + className);               /**             * 获取Class对象            * @see 加载以字符串形式给出的含完整包名的类名所对应的类            * @see 加载类之后,会自动创建并返回一个Class类型的对象,它所描述的就是指定类的信息            */           Class<?> clazz = null;            try {                clazz = Class.forName(className);            } catch (ClassNotFoundException e) {                e.printStackTrace();            }                        /**            * 解析属性信息            */           Field[] declaredFields = clazz.getDeclaredFields(); //获取clazz所关联的数据类型中声明过的所有属性和成员变量,但不包括父类中的            for (Field field : declaredFields) {                System.out.println("-----------------------------------------------------------------------------------------");                System.out.println("属性:" + field.toString()); //输出字符串形式的属性格式,包括访问权限、数据类型、属性名、甚至初值等等                System.out.println("\t数据类型:" + field.getType()); //返回当前属性的数据类型                System.out.println("\t属性名:" + field.getName()); //返回当前属性的名字                // 返回当前属性的访问控制修饰符。修饰符可能有多个,如public、static、final等等                int mod = field.getModifiers(); //实际上返回的是一个用整形数值表示的修饰符的组合。比如1代表public,17代表public加static                System.out.println("\t属性修饰符:" + Modifier.toString(mod)); //将整型修饰符转换成字符串的表现形式            }                        /**             * 解析方法信息            * @see 即解析当前类型中所封装的方法的信息            */           Method[] declaredMethods = clazz.getDeclaredMethods(); //返回当前类中声明的所有的方法信息。只限于当前类的层次,不包括父类中的            for(Method method : declaredMethods){                System.out.println("-----------------------------------------------------------------------------------------");                System.out.println("方法:" + method.toString()); //输出方法头。也就是方法的标签,方法的格式                System.out.println("\t方法名:" + method.getName()); //解析方法的名字                System.out.println("\t方法修饰符:" + Modifier.toString(method.getModifiers())); //返回该方法的访问控制修饰符                System.out.println("\t返回值类型:" + method.getReturnType()); //它返回的是Class对象,输出时会自动调用toString()方法                System.out.print("\t方法参数列表:");                Class<?>[] parameterTypes = method.getParameterTypes(); //获取当前方法的参数列表,返回每个参数的类型,其均被封装为Class类型                for (int i=0; i<parameterTypes.length; i++) {                    Class<?> methodParameterType = parameterTypes[i];                    if(0 != i){                        System.out.print(", "); //输出每一个参数之前打印一个逗号,作为与前一个参数的类型的分隔                    }                    System.out.print(methodParameterType); //Class对象的toString()方法也被重写过,它会输出当前数据类型的名字                }                System.out.println(); //输出第二个方法的信息时,换行显示            }                        /**             * 解析构造方法信息            * @see 这里没有获取它的返回值。实际上Constructor类型中也不支持getReturnType()的功能            * @see 因为构造方法在声明的时候,不允许指定它的返回值            * @see 实际上它是有返回值的,即它所属的类的类型。因为构造方法运行的最后,也能够创建一个新对象,并返回其句柄            */           Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors(); //返回当前类中声明的所有构造方法            for (Constructor<?> constructor : declaredConstructors) {                System.out.println("-----------------------------------------------------------------------------------------");                System.out.println("构造方法:" + constructor.toString());                               System.out.println("\t方法名:" + constructor.getName());                System.out.println("\t方法修饰符:" + Modifier.toString(constructor.getModifiers()));                System.out.print("\t方法参数列表:");                Class<?>[] parameterTypes = constructor.getParameterTypes();                for (int i=0; i<parameterTypes.length; i++) {                    Class<?> constructorParameterType = parameterTypes[i];                    if(0 != i){                        System.out.print(", ");                    }                    System.out.print(constructorParameterType);                }                System.out.println();            }            System.out.println("-----------------------------------------------------------------------------------------");                        /**             * 解析当前类的父类            */           Class<?> superClass = clazz.getSuperclass(); //它返回的也是一个Class类型的结果,对应的是当前类的父类            //实际上Class类是一个泛型类。比较规范的用法是给它一个类型参数,即类似于Class<String>的形式            System.out.println("当前类的父类:" + superClass.toString());                  System.out.println("-----------------------------------------------------------------------------------------");                        /**             * 解析当前类实现的接口            */           Class<?>[] interfaces = clazz.getInterfaces(); //获取当前类所实现的所有接口,返回多个接口类型所封装成的Class数组            System.out.println("当前类所实现接口:");            for (Class<?> clazzInterface : interfaces) {                System.out.println(clazzInterface.toString());            }                       System.out.println("-----------------------------------------------------------------------------------------");                        /**             * 解析当前类型所在包信息            */           Package clazzPackage = clazz.getPackage(); //获取当前类所在的包的信息。如果没有,则返回空的双引号,即一个长度为零的字符串            System.out.println("当前类所在的包:" + clazzPackage.toString());        }    }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxjjd.html