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

【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);
            }
        }
    }
}

相关文章:

  • C++从入门到入土(八)——多态的原理
  • 【GIS】重要技术3DGS
  • 改变一生的思维模型【12】笛卡尔思维模型
  • 【嵌入式学习】计算机组成原理-二进制存储基础
  • Spring Boot 的自动装配
  • 几种常见的激活函数解析
  • Vue学习笔记集--scoped组件
  • Elasticsearch面试题
  • 基于ssm的电子病历系统(全套)
  • 嵌入式项目代码架构与分层
  • 【AI 加持下的 Python 编程实战 2_04】第三章:GitHub Copilot 在 Python 函数设计中的正确打开方式(含本地实操)
  • python局部变量和全局变量
  • 深入理解 C++20 中的 `std::shared_ptr` 原子操作
  • JDK 动态代理和 CGLIB 动态代理
  • 新能源电站系统建设提速!麒麟信安操作系统驱动光伏风电双领域安全升级
  • PEFT简介
  • GitHub Copilot 在 VS Code 上的终极中文指南:从安装到高阶玩法
  • 特种兵旅游之大连3日游
  • Android视频渲染SurfaceView强制全屏与原始比例切换
  • 塔能科技:做节能界的“催化剂”,加速工厂能源改造变革
  • 济南市委副秘书长吕英伟已任历下区领导
  • 民生谣言误导认知,多方联动守护清朗——中国互联网联合辟谣平台2025年4月辟谣榜综述
  • 文学花边|对话《借命而生》原著作者石一枫:我给剧打90分
  • 美国“贸易战”前线的本土受害者:安静的洛杉矶港和准备关门的小公司
  • 普京提议于15日在土耳其恢复俄乌直接谈判
  • 5天完成1000多万元交易额,“一张手机膜”畅销海内外的启示