zoukankan      html  css  js  c++  java
  • java反射

    需要的Student实体类

    public class Student {
    
        private String name = "小黑黑";
        public Integer age;
        protected Date birthday;
        int num;
    
        static {
            System.out.println("student的静态代码块");
        }
    
        public static void testStudent() {
            System.out.println("这是静态方法....");
        }
    
        // 私有的方法
        private int getNum(int num) {
    
            return num + 10;
        }
    
        /*
         * 在获取 私有属性值的时候 需要注释掉 private Student() {
         * System.out.println("这是Student无参构造"); }
         */
        public Student() {
            System.out.println("这是Student无参构造");
        }
    
        public Student(String name, int age, Date birthday) {
            System.out.println("这是Student带参构造");
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
    }

    测试类代码

    public class ReflectTest { // 反射
    
        /**
         * 所有类的对象 都是Class的实例
         * 所有类的父类都是Object
         */
        @Test
        public void getClassName() {
            Student stu = new Student();
            System.out.println(stu.getClass().getSuperclass());
            System.out.println(Student.class.getSuperclass());
            System.out.println(String.class.getSuperclass());
            System.out.println(Integer.class.getSuperclass().getSuperclass());
        }
    
        // 三种方式 获取 指定类的 完整限定名
        @Test
        public void getClazz() throws Exception {
            System.out.println(Class.forName("cn.bdqn.test.Student").getName());
            System.out.println(new Student().getClass().getName());
            System.out.println(Student.class.getName());
        }
    
        // 通过反射获取指定类的信息
        @Test
        public void getMsg() throws Exception {
            Class c = Class.forName("cn.bdqn.test.Student");
            System.out.println("全类名:" + c.getName());
            System.out.println("包名:" + c.getPackage().getName());
            System.out.println("类名:" + c.getSimpleName());
    
            int num = c.getModifiers();
            System.out.println(num);
            System.out.println(Modifier.toString(num));
        }
    
        // 通过反射获取属性的信息
        @Test
        public void getFileds() throws Exception {
            Class c = Class.forName("cn.bdqn.test.Student");
            // 获取所有public修饰的字段
            Field[] fields = c.getFields();
            for (int i = 0; i < fields.length; i++) {
                System.out.println(fields[i]);
            }
            System.out.println("获取所有的属性名称****************");
            fields = c.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                System.out.println(fields[i].getName());
            }
            System.out.println("获取所有属性的修饰符*****************");
            // default的int值 是 0
            for (int i = 0; i < fields.length; i++) {
                System.out.println(Modifier.toString(fields[i].getModifiers()));
            }
        }
    
        // 通过反射观察执行顺序
        @Test
        public void getC() throws Exception {
            Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块
            // Student.testStudent();
            // Student student = new Student(); // 耦合 无参构造
            Student student = (Student) c.newInstance(); // 解耦合 无参构造
        }
    
        // 通过反射获取类中的构造方法
        @Test
        public void getConstructors() throws Exception {
            Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块
            Constructor[] constructors = c.getDeclaredConstructors();
            for (int i = 0; i < constructors.length; i++) {
                System.out.println("构造的修饰符:"
                        + Modifier.toString(constructors[i].getModifiers()));
                System.out.println("构造的名称:" + constructors[i].getName());
                // 1.8才有getParameterCount
                System.out
                        .println("构造的参数个数:" + constructors[i].getParameterCount());
    
                Class[] types = constructors[i].getParameterTypes(); // 参数的类型
                for (Class class1 : types) {
                    System.out.println("参数的类型:" + class1.getName());
                    System.out.println("参数的类型简写:" + class1.getSimpleName());
                }
                System.out.println("******************************");
            }
        }
    
        // 通过反射获取类中的构造方法
        @Test
        public void setFiledName() throws Exception {
            Student student = Student.class.newInstance();
            Class c = student.getClass();
    
            // 获取指定的属性
            Field field = c.getDeclaredField("name");
            // 设置属性的访问权限
            field.setAccessible(true);
            System.out.println(field.get(student));
        }
    
        // 通过反射获取类中的构造方法
        @SuppressWarnings("unchecked")
        @Test
        public void getMethod() throws Exception {
            Student student = Student.class.newInstance();
            Class c = student.getClass();
            System.out.println(student.age);
            Method method = c.getDeclaredMethod("setAge", Integer.class);
            // 执行方法
            method.invoke(student, 50);
            System.out.println(student.age);
            // 执行私有的带有参数的 并且有返回值的方法
            method = c.getDeclaredMethod("getNum", int.class);
            // 开启方法的权限
            method.setAccessible(true);
            int num = (Integer) method.invoke(student, 50);
            System.out.println(num);
    
        }
    
    }
  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7093972.html
Copyright © 2011-2022 走看看