zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    Asp Net Core Fro MongoDB Part1
    Word 离线发布bolg测试
    Word 2016问题导致无法创建其他博客账号
    字符集工具
    人工智能笔摘
    js数组去重
    ##react-native学习笔记(windows android)##第4天,分析下目录结构
    ##react-native学习笔记(windows android)##第3天,解决白屏闪退问题
    ##react-native学习笔记(windows android)##第2天, Hello world !
    ##react-native学习笔记(windows android)##第1天,搭建开发环境
  • 原文地址:https://www.cnblogs.com/duxie/p/14161426.html
Copyright © 2011-2022 走看看