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);
    }
}
原文地址:https://www.cnblogs.com/duxie/p/14161426.html