Java 反射

211 阅读1分钟

Java反射

定义

// TODO

原理

// TODO

java中反射的常规使用

package com.masily.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.stream.Stream;

public class ReflectLearn {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException {
        // 正射使用
        User user = new User();
        // 一、反射使用:调用get方法
        // 1.获取类的 Class 对象实例:事先知道使用哪个类(或者使用Class.forName(""))
        Class<User> userClass = User.class;
        // 2.根据 Class 对象实例获取 Constructor 对象:获取该类的构造器
        Constructor<User> userConstructor = userClass.getConstructor();
        // 3.使用 Constructor 对象的 newInstance 方法获取反射类对象:初始化该类
        Object user1 = userConstructor.newInstance();
        // 4.获取方法的 Method 对象:获取该类的getAge方法
        Method getAgeMethod = userClass.getMethod("getAge");
        // 5.利用 invoke 方法调用方法:使用上述方法调用invoke方法获取方法的返回值
        Object a = getAgeMethod.invoke(user1);
        System.out.println(a);

        // 二、反射使用:调用set方法
        Class<User> userClass1 = (Class<User>) Class.forName("com.masily.utils.User");
        Constructor<User> userConstructor1 = userClass1.getConstructor();
        Constructor<User> userConstructor2 = userClass1.getConstructor(String.class, int.class, String.class);
        User user2 = userConstructor1.newInstance();
        User user3 = userConstructor2.newInstance("123", 4, "567");
        Method setAgeMethod2 = userClass1.getMethod("setAge", int.class);
        Method setAgeMethod3 = userClass1.getMethod("setAge", int.class);
        setAgeMethod2.invoke(user2, 6);
        setAgeMethod3.invoke(user3, 5);
        Method getAgeMethod2 = userClass1.getMethod("getAge");
        Object b = getAgeMethod2.invoke(user2);
        Object c = getAgeMethod2.invoke(user3);
        System.out.printf("b的值%d\n", b);
        System.out.printf("c的值%d\n", c);

        // 反射使用:获取所有属性
        // 1.获取所有属性不包含私有属性
        Field[] fields1 = userClass.getFields();
        Stream.of(fields1).forEach(field -> System.out.println(field.getName()));
        // 2.获取所有属性包含私有属性
        Field[] fields2 = userClass.getDeclaredFields();
        Stream.of(fields2).forEach(field -> System.out.println(field.getName()));
    }
}