一、反射定义
在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
二、涉及到概念Class、Constructor、Field、Method
- Class
 程序运行期间,Java运行时系统为所有对象维护的一个被称为运行时的类型标识。
 获取Class方式三种:
 1)getClass ( )
 2).class
 2)静态方法 forName
public class User {
    private String userName;
    private int age;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User() {
        this.userName = "";
        this.age = 1;
    }
    public User(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }
}
public class Main {
    public static void main(String[] args) throws  Exception{
        User user = new User("张三",20);
        Class clz1 = user.getClass();
        Class clz2 = User.class;
        Class clz3 = Class.forName("User");
        System.out.println(clz1 == clz2);
        System.out.println(clz2 == clz3);
    }
}
Class其他方法
1)创建实例, User user2 = (User) clz2.newInstance();
2)获取构造函数Constructor[] constructors = clz1.getConstructors();
3)获取成员变量Field[] fields = clz1.getDeclaredFields(); Declared声明的,包含private类型的方法。
4)获取方法Method[] methods = clz1.getMethods();
- Constructor类
 1)获取名称getName()
 2)创建对象newInstance()
public class Test01 {
    public static void main(String[] args) {
        User user = new User("zhangsan", 20);
        Class clz = user.getClass();
        System.out.println("clz.getName():" + clz.getName());
        try {
            User user2 = (User) clz.newInstance();
            System.out.println("user2.age:" + user2.getAge());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

- Field类
 1)getName()获取名称
 2)getType()获取类型
 3)set(Object obj, Object value)设置值
import java.lang.reflect.Field;
public class Tmp {
    private int id;
    private String name;
    private double price;
    public Tmp() {
        this.id = 0;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Tmp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
    public static void main(String[] args) {
        Tmp tmp = new Tmp();
        tmp.setName("辣椒");
        tmp.setPrice(100);
        try {
            Class clz = tmp.getClass();
            Field fieldPrice = clz.getDeclaredField("price");
            System.out.println("price:" + fieldPrice.get(tmp));
            Field fieldId = clz.getDeclaredField("id");
            System.out.println("type:" + fieldId.getType());
            int val = fieldId.getInt(tmp);
            System.out.println("id:" + val);
            fieldId.set(tmp, 12);
            System.out.println("id->" + fieldId.getInt(tmp));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

- Method类
 1)invoke()方法调用
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodTest {
    private int id;
    private String name;
    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 m1(){
        System.out.println("m1()...");
        return 0;
    }
    public int m2(int param1, int param2) {
        System.out.println("m2()..." + param1 + " _ " + param2 + "");
        return param1+param2;
    }
    public static void main(String[] args) {
        MethodTest methodTest = new MethodTest();
        try {
            Class clz = Class.forName("MethodTest");
            Method m1 = clz.getMethod("m1",null);
            System.out.println("m1计算结果:" + m1.invoke(methodTest, null));
            Method m2 = clz.getMethod("m2", int.class, int.class);
            Object obj = m2.invoke(methodTest, 3, 4);
            System.out.println("m2计算结果:" + Integer.valueOf(obj.toString()));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

三、小记
慢慢探索、深入,争取写出点有意义的东西。
来源:CSDN
作者:jinangailiuzi
链接:https://blog.csdn.net/y20190609/article/details/103360647