反射 p4 反射获取类的结构信息

发布时间 2023-07-25 19:50:45作者: 凉白茶

反射获取类的结构信息

  1. 关于Class的API

    1. getName:获取全类名
    2. getSimpleName:获取简单类名
    3. getFields:获取所有Public修饰的属性,包含本类及其父类(不仅仅是直接父类)
    4. getDeclaredFields:获取本类中的所有属性,不包括父类
    5. getMethods:获取所有public修饰的方法,包含本类及其父类的(不仅仅是直接父类)
    6. getDeclaredMethods:获取本类中所有方法,不包括父类
    7. getConstructors:获取所有public修饰的构造器,不包括父类
    8. getDeclaredConstructors:获取本类中的所有构造器,不包括父类,构造器不能被继承
    9. getPackage:以Package形式返回包信息
    10. getSuperClass:以Class形式返回父类信息
    11. getInterface:以Class[]形式返回接口信息,不包括父类
    12. getAnnotations:以Annotation[]形式返回注解信息
  2. 关于Field的API

    1. getModifiers:以int的形式返回修饰符
      规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getType:以Class形式返回属性类型
    3. getName:获得属性名
  3. 关于Method的API

    1. getModifiers:以int的形式返回修饰符
      规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getReturnType:以Class形式返回方法返回值类型
    3. getName:获得方法名
    4. getParameterTypes:以Class[]形式返回方法的形参列表
  4. 关于Constructor的API

    1. getModifiers:以int的形式返回修饰符
      规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getName:获得构造器名
    3. getParameterTypes:以Class[]形式返回构造器的形参列表
  5. 案例演示

    package com.hspedu.reflection;
    
    
    import org.junit.Test;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * @author: 86199
     * @date: 2023/6/4 10:42
     * @description: 演示如何通过反射获取类的结构信息
     */
    public class ReflectionUtils {
        public static void main(String[] args) throws ClassNotFoundException {
            ReflectionUtils reflectionUtils = new ReflectionUtils();
            System.out.println("========================api_01()=======================");
            reflectionUtils.api_01();
            System.out.println("========================api_02()=======================");
            reflectionUtils.api_02();
    
        }
    
        //第一组方法API:java.lang.Class
        @Test
        public void api_01() throws ClassNotFoundException {
            //得到Class对象
            Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
            //1. getName:获取全类名
            System.out.println(personCls.getName());//com.hspedu.reflection.Person
            //2. getSimpleName:获取简单类名
            System.out.println(personCls.getSimpleName());//Person
            //3. getFields:获取所有Public修饰的属性,包含本类及其父类(不仅仅是直接父类)
            for (Field field : personCls.getFields()) {
                System.out.println("本类及父类的公有属性"+ field.getName());
            }
            //4. getDeclaredFields:获取本类中的所有属性,不包括父类
            for (Field declaredField : personCls.getDeclaredFields()) {
                System.out.println("本类中所有属性" + declaredField.getName());
            }
            //5. getMethods:获取所有public修饰的方法,包含本类及其父类的(不仅仅是直接父类)
            for (Method method : personCls.getMethods()) {
                System.out.println("本类及其父类的公有方法 = " + method);
            }
            //6. getDeclaredMethods:获取本类中所有方法,不包括父类
            for (Method declaredMethod : personCls.getDeclaredMethods()) {
                System.out.println("本类的方法 = " + declaredMethod);
            }
            //7. getConstructors:获取所有public修饰的构造器,不包括父类
            for (Constructor<?> constructor : personCls.getConstructors()) {
                System.out.println("本类的public构造器 = " + constructor);
            }
            //8. getDeclaredConstructors:获取本类中的所有构造器,不包括父类,构造器不能被继承
            for (Constructor<?> declaredConstructor : personCls.getDeclaredConstructors()) {
                System.out.println("本类的所有构造器 = " + declaredConstructor);
            }
            //9. getPackage:以Package形式返回包信息
            System.out.println(personCls.getPackage());//package com.hspedu.reflection
            //10. getSuperClass:以Class形式返回父类信息
            System.out.println("父类的class对象 = " + personCls.getSuperclass());//父类的class对象 = class com.hspedu.reflection.A
            //11. getInterface:以Class[]形式返回接口信息,不包括父类
            for (Class<?> anInterface : personCls.getInterfaces()) {
                System.out.println("接口信息 = " + anInterface);
            }
            //12.getAnnotations:以Annotation[]形式返回注解信息
            for (Annotation annotation : personCls.getAnnotations()) {
                System.out.println("注解信息 = " + annotation);
            }
        }
    
        //第二组方法API:java.lang.reflect.Filed,java.lang.reflect.Method
        @Test
        public void api_02() throws ClassNotFoundException {
            //得到Class对象
            Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
            //1. getModifiers():以int的形式返回修饰符
            //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getType:以Class形式返回属性类型
            //3. getName:获得属性名
            for (Field declaredField : personCls.getDeclaredFields()) {//获得Field[]
                System.out.println("本类中所有属性 " + declaredField.getName() + " 属性的修饰符值 " + declaredField.getModifiers()
                + "该属性的类型 " + declaredField.getType());
            }
    
            //1. getModifiers():以int的形式返回修饰符
            //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getReturnType:以Class形式返回方法返回值类型
            //3. getName:获得方法名
            //4. getParameterTypes:以Class[]形式返回方法的形参列表
            for (Method declaredMethod : personCls.getDeclaredMethods()) {//获得Method[]
                System.out.print("本类的方法 = " + declaredMethod.getName() + " 方法的修饰符值 " + declaredMethod.getModifiers()
                        + "该方法返回值的类型 " + declaredMethod.getReturnType() + " 方法的参数 ");
                //输出方法的形参数组
                for (Class<?> parameterType : declaredMethod.getParameterTypes()) {
                    System.out.print(parameterType + " ");
                }
                System.out.println();
            }
    
    
            //1. getModifiers():以int的形式返回修饰符
            //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getName:获得构造器名
            //4. getParameterTypes:以Class[]形式返回构造器的形参列表
            for (Constructor<?> constructor : personCls.getDeclaredConstructors()) {//获取Constructor[]
                System.out.print("本类的public构造器 = " + constructor.getName());
                for (Class<?> parameterType : constructor.getParameterTypes()) {
                    System.out.print(" 该构造器的形参类型" +  parameterType + "   ");
                }
                System.out.println();
            }
        }
    }
    
    
    class A{
        public String hobby;
        public A() {
        }
        public void hi(){}
    }
    
    interface IA{}
    interface IB{}
    
    @Deprecated
    class Person extends A implements IA,IB{
        //属性
        public String name;
        String job;
        protected  int age;
        private double sal;
    
        //构造器
        public Person() {
        }
    
        private Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        //方法
        public void m1(String name, int age, double sal){}
        protected String m2(){ return  null; }
        void m3(){}
        private void m4(){}
    }
    
    
    /* 运行结果
    ========================api_01()=======================
    com.hspedu.reflection.Person
    Person
    本类及父类的公有属性name
    本类及父类的公有属性hobby
    本类中所有属性name
    本类中所有属性job
    本类中所有属性age
    本类中所有属性sal
    本类及其父类的公有方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double)
    本类及其父类的公有方法 = public void com.hspedu.reflection.A.hi()
    本类及其父类的公有方法 = public final void java.lang.Object.wait() throws java.lang.InterruptedException
    本类及其父类的公有方法 = public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    本类及其父类的公有方法 = public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    本类及其父类的公有方法 = public boolean java.lang.Object.equals(java.lang.Object)
    本类及其父类的公有方法 = public java.lang.String java.lang.Object.toString()
    本类及其父类的公有方法 = public native int java.lang.Object.hashCode()
    本类及其父类的公有方法 = public final native java.lang.Class java.lang.Object.getClass()
    本类及其父类的公有方法 = public final native void java.lang.Object.notify()
    本类及其父类的公有方法 = public final native void java.lang.Object.notifyAll()
    本类的方法 = void com.hspedu.reflection.Person.m3()
    本类的方法 = private void com.hspedu.reflection.Person.m4()
    本类的方法 = protected java.lang.String com.hspedu.reflection.Person.m2()
    本类的方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double)
    本类的public构造器 = public com.hspedu.reflection.Person(java.lang.String)
    本类的public构造器 = public com.hspedu.reflection.Person()
    本类的所有构造器 = public com.hspedu.reflection.Person(java.lang.String)
    本类的所有构造器 = private com.hspedu.reflection.Person(java.lang.String,int)
    本类的所有构造器 = public com.hspedu.reflection.Person()
    package com.hspedu.reflection
    父类的class对象 = class com.hspedu.reflection.A
    接口信息 = interface com.hspedu.reflection.IA
    接口信息 = interface com.hspedu.reflection.IB
    注解信息 = @java.lang.Deprecated()
    ========================api_02()=======================
    本类中所有属性 name 属性的修饰符值 1该属性的类型 class java.lang.String
    本类中所有属性 job 属性的修饰符值 0该属性的类型 class java.lang.String
    本类中所有属性 age 属性的修饰符值 4该属性的类型 int
    本类中所有属性 sal 属性的修饰符值 2该属性的类型 double
    本类的方法 = m3 方法的修饰符值 0该方法返回值的类型 void 方法的参数 
    本类的方法 = m4 方法的修饰符值 2该方法返回值的类型 void 方法的参数 
    本类的方法 = m2 方法的修饰符值 4该方法返回值的类型 class java.lang.String 方法的参数 
    本类的方法 = m1 方法的修饰符值 1该方法返回值的类型 void 方法的参数 class java.lang.String int double 
    本类的public构造器 = com.hspedu.reflection.Person 该构造器的形参类型class java.lang.String   
    本类的public构造器 = com.hspedu.reflection.Person 该构造器的形参类型class java.lang.String    该构造器的形参类型int   
    本类的public构造器 = com.hspedu.reflection.Person
    */