• java反射机制


    java反射机制

    0)获取Class对象的三种方法

    package com.bean;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/29 08:35
     * @description: 用户实体类
     */
    public class User {
        private int id;
        private String name;
        private int age;
    
        public User() {
        }
    
        public User(int id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

     

    package com.test;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/29 08:34
     * @description: 测试java.lang.Class对象的获取方式
     * java不是动态语言,但是可以通过反射做动态操作
     * 动态语言:程序运行时可以改变程序结构或变量类型(如:Python;JS)
     * 一个类被加载后,JVM会创建该类的一个Class对象,类的整个结构会放到该对象中
     * 这个对象就像镜子一样,可以看见该类的所有信息(所以叫反射机制)
     * 一个类只对应一个Class对象
     * 反射在提高开发效率的同时会增加程序运行的时间,可以禁止安全检查,以提高运行速度(设置setAccessible(true))
     */
    public class Demo1 {
        public static void main(String[] args) throws Exception {
            Class clazz = Class.forName("com.bean.User");
            System.out.println(clazz);
    
            Class strClass = String.class;
    
            Class strClass2 = args.getClass();
            System.out.println(strClass == strClass2);
        }
    }

     

    1)获取类的信息

    package com.test;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/29 13:56
     * @description: 利用反射的API,获取类的信息
     */
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            Class clazz = Class.forName("com.bean.User");
    
            //获取包名+类名
            System.out.println(clazz.getName());
            //获取类名
            System.out.println(clazz.getSimpleName());
            System.out.println("==========================");
    
            //获取非私有的属性
            Field[] fields = clazz.getFields();
            System.out.println(fields.length);
            //获取所有属性,包括私有
            Field[] fields1 = clazz.getDeclaredFields();
            for (Field field : fields1) {
                System.out.println("属性:" + field);
            }
            //获取指定属性
            Field field = clazz.getDeclaredField("name");
            System.out.println("name:" + field);
            System.out.println("==========================");
    
            //获取所有方法
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                System.out.println("方法:" + method);
            }
            //获取指定方法(无参)
            Method method = clazz.getDeclaredMethod("getName", null);
            //获取指定方法(有参)
            Method method1 = clazz.getDeclaredMethod("setName", String.class);
            System.out.println("==========================");
    
            //获取所有构造器(构造方法)
            Constructor[] constructors = clazz.getDeclaredConstructors();
            for (Constructor constructor : constructors) {
                System.out.println("构造器:" + constructor);
            }
            //获取指定构造器
            Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
            System.out.println("指定构造器:" + constructor);
        }
    }

     

    2)执行方法

    package com.test;
    
    import com.bean.User;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/29 14:21
     * @description: 利用反射的API,获取实例,进行操作
     */
    public class Demo3 {
        public static void main(String[] args) throws Exception {
            Class<User> clazz = (Class<User>) Class.forName("com.bean.User");
    
            //调用无参初始化对象
            User user = clazz.newInstance();
            //调用有参初始化对象
            Constructor<User> constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
            User user1 = constructor.newInstance(001, "xdzy", 18);
            System.out.println(user1.getName());
            System.out.println("=====================");
    
            //执行方法
            User user3 = clazz.newInstance();
            Method method = clazz.getDeclaredMethod("setName", String.class);
            method.invoke(user3, "xdzy");
            System.out.println(user3.getName());
            System.out.println("=====================");
    
            //操作属性
            User user4 = clazz.newInstance();
            Field field = clazz.getDeclaredField("name");
            //禁止安全检查(直接可以访问所有属性)
            field.setAccessible(true);
            field.set(user4, "xdzy");
            System.out.println(user4.getName());
            System.out.println(field.get(user4));
        }
    }

     

  • 相关阅读:
    比较简短的拼音首字母自定义函数
    程序员之路——一个老程序员对刚上大学的学弟学妹的忠告
    Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
    对当前软件行业的一点点感想
    调用opengl程序代码
    windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
    应该被记住的8位Java人物
    软件开发高手须掌握的4大SQL精髓语句(二)
    如何建立一个网站(我的5年经验谈)
    vs 2010 express 查看malloc能分配多少内存
  • 原文地址:https://www.cnblogs.com/xdzy/p/9554555.html
Copyright © 2020-2023  润新知