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

这篇具有很好参考价值的文章主要介绍了反射 p4 反射获取类的结构信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

反射获取类的结构信息

  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. 案例演示文章来源地址https://www.toymoban.com/news/detail-602940.html

    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
    */
    

到了这里,关于反射 p4 反射获取类的结构信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包