• Java 反射 代码详解


    package com.lidaochen.test;
    
    public class CPerson {
        private int age;
        private String name;
        public String a;
        protected String b;
        String c;
        private String d;
    
        public CPerson(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public CPerson() {
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    1、获取字节码Class对象的三种方式

    package com.lidaochen.test;
    
    public class CJavaDemo {
        public static void main(String[] args) throws Exception{
            // 1、Class.forName("全类名")
            Class class1 = Class.forName("com.lidaochen.test.CPerson");
            System.out.println(class1);
            // 2、类名.class
            Class class2 = CPerson.class;
            System.out.println(class2);
            // 3、对象.getClass()
            CPerson person = new CPerson();
            Class class3 = person.getClass();
            System.out.println(class3);
            // 比较三个对象
            System.out.println(class1 == class2);
            System.out.println(class1 == class3);
        }
    }
    

    2、通过 Class 对象获取 Field

    package com.lidaochen.test;
    
    import java.lang.reflect.Field;
    
    public class CJavaDemo {
        public static void main(String[] args) throws Exception{
            // 0、获取 CPerson 的 Class 对象
            Class mem = CPerson.class;
            // 1、getFields()获取所有public修饰的成员变量
            Field[] fields = mem.getFields();
            for (Field field : fields)
            {
                System.out.println(field);
            }
            System.out.println("--------------------");
            // 2、Field getField(String name)
            Field a = mem.getField("a");
            // 获取成员变量 a 的值
            CPerson person = new CPerson();
            Object value = a.get(person);
            System.out.println(value);
            // 设置成员变量 a 的值
            a.set(person, "李道臣");
            value = a.get(person);
            System.out.println(value);
            System.out.println("--------------------");
            // 3、Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
            Field[] declaredFields = mem.getDeclaredFields();
            for (Field field : declaredFields)
            {
                System.out.println(field);
            }
            System.out.println("--------------------");
            // 4、Field getDeclaredField(String name)
            Field d = mem.getDeclaredField("d");
            // 忽略访问权限修饰符的安全检查(暴力反射)
            d.setAccessible(true);
            value = d.get(person);
            System.out.println(value);
        }
    }

    3、通过 Class 对象功能获取 Constructor

    package com.lidaochen.test;
    
    import java.lang.reflect.Constructor;
    
    public class CJavaDemo {
        public static void main(String[] args) throws Exception{
            // 0、获取 CPerson 的 Class 对象
            Class mem = CPerson.class;
            // 1、获取带参数的 Constructor
            Constructor constructor = mem.getConstructor(int.class, String.class);
            System.out.println(constructor);
            // 创建对象
            Object person1 = constructor.newInstance(20, "李道臣");
            System.out.println(person1);
            System.out.println("--------------------");
            // 2、获取不带参数的 Constructor
            constructor = mem.getConstructor();
            System.out.println(constructor);
            // 创建对象
            Object person2 = constructor.newInstance();
            System.out.println(person1);
            // 无参构造创建对象 还可以这样创建
            Object person3 = mem.newInstance();
            System.out.println(person3);
        }
    }

    4、通过 Class 对象 获取 Method

    package com.lidaochen.test;
    
    import java.lang.reflect.Method;
    
    public class CJavaDemo {
        public static void main(String[] args) throws Exception{
            // 0、获取 CPerson 的 Class 对象
            Class mem = CPerson.class;
            // 1、获取指定名称的方法
            CPerson p = new CPerson();
            // 不带参数
            Method eat_method1 = mem.getMethod("eat");
            eat_method1.invoke(p);
            // 带参数
            Method eat_method2 = mem.getMethod("eat", String.class);
            eat_method2.invoke(p, "西瓜");
            System.out.println("--------------------");
            // 2、获取所有public修饰的方法
            Method[] methods = mem.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
            System.out.println("--------------------");
            // 3、获取类名
            String className = mem.getName();
            System.out.println(className);
        }
    }

    5、实例:通过Java反射,动态执行任何类的任何方法

    package com.lidaochen.test;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.lang.reflect.Method;
    import java.util.Properties;
    
    public class CJavaDemo {
        public static void main(String[] args) throws Exception{
            // 1、加载配置文件
            Properties properties = new Properties();
            BufferedReader bufferedReader = new BufferedReader(new FileReader("F:/Projects/JavaDemo/option.properties"));
            properties.load(bufferedReader);
            // 2、获取配置文件中定义的数据
            String className = properties.getProperty("className");
            String methodName = properties.getProperty("methodName");
            // 3、加载该类进内存
            Class cls = Class.forName(className);
            // 4、创建对象
            Object obj = cls.newInstance();
            // 5、获取方法对象
            Method method = cls.getMethod(methodName);
            // 6、执行方法
            method.invoke(obj);
        }
    }
  • 相关阅读:
    23丨当Postgres磁盘读引起IO高的时候,应该怎么办
    22丨案例:当磁盘参数导致IO高的时候,应该怎么办
    LNMP环境搭建
    virtualbox中centos虚拟机网络配置
    chrome扩展程序开发
    Linux账号管理
    Linux设置文件与Shell操作环境
    Yii2之组件的注册与创建
    Stream 源码分析
    Exchanger 源码分析
  • 原文地址:https://www.cnblogs.com/duxie/p/14161426.html
Copyright © 2020-2023  润新知