• 【Java】Reflection 反射机制 02获取类的一切


    先创建一个可演示的类

    注解类

    package cn.dai.Reflection.demo;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.TYPE,ElementType.PACKAGE,ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAt {
        String value() default "sample";
    }

    接口

    public interface Plug {
        void info();
    }

    父类

    public class Creature<T> implements Serializable {
    
        private boolean gender;
        private double weight;
    
        private void breath(){
            System.out.println("生物在呼吸");
        }
    
        public void eat(){
            System.out.println("生物吃食");
        }
    }

    本类

    @MyAt("Animal")
    public class Animal extends Creature<String> implements Comparable<String>,Plug {
    
        @MyAt("旺财")
        private String name;
        public int id;
    
        public Animal() {
        }
    
        public Animal(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        @MyAt("雪糕")
        public Animal(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        @MyAt("中国")
        public String show(String nation){
            System.out.println("我来自:"+ nation);
            return nation;
        }
    
    
        @Override
        public void info() {
            System.out.println("我是一个动物!!!");
        }
    
        @Override
        public int compareTo(String o) {
            return 0;
        }
    
        @Override
        public String toString() {
            return "Animal{" +
                    "name='" + name + '\'' +
                    ", id=" + id +
                    '}';
        }
    }

    获取运行时类的所有结构

    属性获取

        @Test
        public void getInstanceAllField(){
            Class<Animal> animalClass = Animal.class;
    
            // 获取本类和父类的所有属性,返回一个属性类实例的数组 本类和父类private修饰的字段是不能被获取到的
            Field[] fields = animalClass.getFields();
    
            for (Field field : fields) {
                System.out.println(field);
            }
    
            System.out.println("-----------------------------------------------------------------");
    
            // getDeclaredFields(); 当前运行时类的所有属性 没有访问权限限制,仅限本类独有的字段
            Field[] declaredFields = animalClass.getDeclaredFields();
            for (Field field : declaredFields) {
                System.out.println(field);
            }
        }
    
        @Test
        public void getInstance2(){
            Class<Animal> animalClass = Animal.class;
            
            Field[] declaredFields = animalClass.getDeclaredFields();
            for (Field field : declaredFields) {
                // 权限修饰访问
                int modifiers = field.getModifiers();//获取访问权限修饰 返回的是一个权限状态值
                String accessModifier = Modifier.toString(modifiers); // 通过这个权限修饰类转换一下
    
                // 数据类型访问 获取
                Class<?> fieldType = field.getType();
                String fieldTypeName = fieldType.getName();
    
                // 字段标识名 获取
                String fieldName = field.getName();
    
                System.out.println(accessModifier + " " + fieldTypeName + " " + fieldName);
            }
        }

    方法的获取

        @Test
        public void getMethods(){
            Class<Animal> animalClass = Animal.class;
    
            // 获取当前运行时类和及其父类,所有public修饰的方法
            Method[] methods = animalClass.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
    
            System.out.println("-----------------------------------------------------------------");
    
            // 获取当前运行时类中声明的所有方法,不包含父类
            Method[] declaredMethods = animalClass.getDeclaredMethods();
            for (Method method:declaredMethods) {
                System.out.println(method);
            }
        }
    
        @Test
        public void getFactor(){
            // 权限修饰,返回类型,方法名,参数,抛出的异常,注解,注解的值
            Class<Animal> animalClass = Animal.class;
            // 获取声明的注解
            Method[] declaredMethods = animalClass.getDeclaredMethods();
            for (Method method:declaredMethods) {
    
                Annotation[] annotations = method.getAnnotations();
                for (Annotation annotation: annotations) {
    
                    System.out.println(annotation); // @cn.dai.Reflection.demo.MyAt(value=中国)
                }
    
                // 获取方法的权限修饰
                int modifiers = method.getModifiers();
                String accessModifier = Modifier.toString(modifiers);
    
                // 获取返回类型
                Class<?> returnType = method.getReturnType();
                String returnTypeName = returnType.getName();
    
                // 获取方法名
                String methodName = method.getName();
    
                // 获取参数
                Class<?>[] parameterTypes = method.getParameterTypes();
                if (!(parameterTypes == null && parameterTypes.length == 0)){
    
                    for (int i = 0; i < parameterTypes.length; i++) {
                        System.out.println(parameterTypes[i].getName() + "参数" + i);
                    }
                }
    
                // 异常的获取
                Class<?>[] exceptionTypes = method.getExceptionTypes();
                if (exceptionTypes.length > 0){
                    for (int i = 0; i < exceptionTypes.length; i++) {
                        System.out.println( exceptionTypes[i].getName() );
                    }
                }
            }
        }

    构造器获取

        @Test
        public void constructor(){
            Class<Animal> animalClass = Animal.class;
    
            // 当前运行时类中声明为Public 的构造器
            Constructor[] constructors = animalClass.getConstructors();
            for (Constructor constructor:constructors) {
                System.out.println(constructor);
            }
    
            System.out.println("--------------------------------------");
    
            // 当前运行时类自己的构造器,无论权限修饰
            Constructor[] declaredConstructors = animalClass.getDeclaredConstructors();
            for (Constructor constructor: declaredConstructors) {
                System.out.println(constructor);
            }
        }

    父类获取,及泛型获取

        @Test
        public void superClass(){
            Class<Animal> animalClass = Animal.class;
    
            // 仅父类
            Class<? super Animal> superclass = animalClass.getSuperclass();
            System.out.println(superclass);
    
            // 带泛型的父类
            Type genericSuperclass = animalClass.getGenericSuperclass();
            System.out.println(genericSuperclass);
    
            ParameterizedType type = (ParameterizedType)genericSuperclass;
    
            // 多个泛型参数类
            Type[] actualTypeArguments = type.getActualTypeArguments();
            // 取第一个泛型参数类的名字
            System.out.println(((Class)actualTypeArguments[0]).getName());
        }

    接口,所在包,注解

        @Test
        public void IPA(){
            Class<Animal> animalClass = Animal.class;
    
            // 接口是多实现的,所有可能有多个存在
            Class<?>[] interfaces = animalClass.getInterfaces();
    
            for (Class interFace:interfaces) {
                System.out.println(interFace);
            }
    
            System.out.println("---------------------------------------");
    
            // 获取父类接口
            Class<?>[] interfaces1 = animalClass.getSuperclass().getInterfaces();
    
            for (Class interFace:interfaces1) {
                System.out.println(interFace);
            }
    
            System.out.println("----------------------------------------");
    
            // 所在包
            Package aPackage = animalClass.getPackage();
            System.out.println(aPackage);
    
            // 类上的注解
            Annotation[] annotations = animalClass.getAnnotations();
            for (Annotation annotation : annotations){
                System.out.println(annotation);
            }
        }
  • 相关阅读:
    怎样把echarts图表做成响应式的
    检测IE浏览器兼容Edge模式及IE11
    封装微信jssdk自定义分享代码
    C# json字符串 转换成数组、集合、相应对象 sansan
    ObjectC 正确使用内存的几条法则 sansan
    c# 利用反射设置属性值 sansan
    ie6不能识别option标签的selected属性解决方案 sansan
    sql server 2005/2008 设置 sql身份验证 和 sa空密码(像sql2000一样使用)(转载) sansan
    SqlServer 日期时间格式转换 sansan
    C#获取文件大小 sansan
  • 原文地址:https://www.cnblogs.com/mindzone/p/12759440.html
Copyright © 2020-2023  润新知