当前位置: 首页 > article >正文

【Spring】第二弹:通过反射机制初步理解 IoC

一、Java 反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

反射关键API:java.lang.Class+java.lang.reflect

1、首先我们创建一个 Car 类:


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
    //属性
    private String name;

    private int age;

    private String color;

    //普通方法
    private void run() {
        System.out.println("私有方法-run.....");
    }
}

2、通过反射获取类并实例化:

public class ReflectCar {
    /**
     * 输出结果:
     * class Ioc.Car
     * class Ioc.Car
     * class Ioc.Car
     * @param args
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 获取Car类的三种方式
        Class<Car> carOldClass = Car.class;
        System.out.println(carOldClass);
        Class<? extends Car> newClass = new Car().getClass();
        System.out.println(newClass);
        Class<?> carClass = Class.forName("Ioc.Car"); //Car类的全路径
        System.out.println(carClass);
        /**
         * 获取Car的构造方法:无参构造和带参构造
         * 方法名称:Ioc.Car 参数个数:0
         * 方法名称:Ioc.Car 参数个数:3
         */
        Constructor<?>[] carClassDeclaredConstructors = carClass.getDeclaredConstructors();
        for (Constructor<?> constructor : carClassDeclaredConstructors) {
            System.out.println("方法名称:"+constructor.getName()+" 参数个数:"+constructor.getParameterCount());
        }
        /**
         * 通过构造方法创建对象
         * Car(name=null, age=0, color=null)
         * Car(name=小黄车, age=1, color=黄色)
         */
        Constructor<?> declaredConstructor1 = carClass.getDeclaredConstructor();
        Car car1 =(Car) declaredConstructor1.newInstance();
        System.out.println(car1);
        Constructor<?> declaredConstructor2 = carClass.getDeclaredConstructor(String.class, int.class, String.class);
        Car car2 = (Car)declaredConstructor2.newInstance("小黄车", 1, "黄色");
        System.out.println(car2);
        /**
         * 通过反射获取属性
         * Car(name=小绿车, age=1, color=黄色)
         * name
         * age
         * color
         */
        Field[] declaredFields = carClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            if(declaredField.getName().equals("name")){
                declaredField.setAccessible(true);
                declaredField.set(car2,"小绿车");
                System.out.println(car2);
            }
            System.out.println(declaredField.getName());
        }
        /**
         * 通过反射获取私有化方法
         * 私有方法-run.....
         */
        Method[] methods = carClass.getDeclaredMethods();
        for (Method method : methods) {
            //执行方法
            if (method.getName().equals("run")){
                method.setAccessible(true);
                Object object = method.invoke(car2);
            }
        }
    }
}


http://www.kler.cn/a/589869.html

相关文章:

  • 本地电脑Java项目发布到公网
  • Java学习第十二天--集合
  • 嵌入式八股RTOS与Linux---前言篇
  • MySQL InnoDB引擎的锁机制详解
  • OceanBase 用户问题精选答疑:OceanBase 版本升级解析
  • 电机控制常见面试问题(十五)
  • 算法-除自身以外数组的乘积
  • 美容院如何通过数据分析降低顾客流失率
  • Apache Shiro 使用教程
  • 拥有一台云服务器能做什么呢?
  • stm32week7
  • AMBA-CHI协议详解(二十二)
  • 【最大异或和——可持久化Trie】
  • STM32输入捕获采集超声波模块HC-SR04响应的高电平
  • 自动化APP测试APPium的元素等待
  • Django Rest Framework 创建纯净版Django项目部署DRF
  • Android Fresco 框架缓存模块源码深度剖析(二)
  • 爬虫代码中需要设置哪些HTTP头部信息?
  • 在遇见— 再遇见
  • docker入门篇