java的反射机制和spring框架的IoC(控制反转)和DI(依赖注入)

java反射机制概述:

java反射机制是指在运行时动态地获取类的信息并对其进行操作的能力。Java反射允许程序员在编写代码时不需要了解类的内部结构,而可以通过反射机制获取类名、属性、方法等信息,并根据这些信息来创建对象、调用方法或者修改属性值。

简而言之就是 JAVA反射是框架的灵魂!

要想使用反射就得获取到代码编译后的字节码文件就是.class文件

Java反射的优点

  1. 动态创建一个对象,而不必知道它的具体类名。
  2. 在运行时判断对象所属的类,从而动态地调用该类的方法。
  3. 在运行时获取类的所有成员变量和方法,包括私有的。
  4. 可以调用一个对象的方法并改变其属性值。
  5. 方便编写泛型代码。

Java反射机制被广泛应用于以下场景:

  1. 框架设计:框架中需要大量使用反射来实现动态加载类、注入依赖等功能。
  2. 插件开发:利用反射可以动态加载插件提供的类,并调用Plugin接口中定义的方法。
  3. 代码生成:通过读取注解、XML等文件,结合反射机制,可以实现很多自动生成代码的工具。
  4. 调试工具:通过反射机制可以查看一个类的所有方法和属性,帮助我们更好地理解类的行为。
  5. 单元测试:反射机制可以方便地调用类中的私有方法和属性,进行单元测试。

Java反射主要涉及到以下类和方法:

Class类:表示一个类的类型,可以获取类的各种信息。

Java反射 API 提供了一个Class类,它包含了有关类的信息,例如类的名称、超类、接口、构造函数、方法和字段等。您可以使用这些信息来创建新的实例、执行方法和读取或设置字段的值。

获取Class对象
Java中的每个类都有一个隐藏的静态字段class,它持有对表示该类的Class对象的引用。可以使用以下方式获取Class对象:

  // 方式一:通过类名获取Class对象
        Class clazz1 = BookDao.class;

        // 方式二:通过对象获取Class对象 BookDao是接口,BookDaoImpl是接口的实现类
        BookDao obj = new BookDaoImpl();
        Class clazz2 = obj.getClass();

        // 方式三:通过类的全限定名获取Class对象
        Class clazz3 = Class.forName("com.yyz.dao.BookDao");

Constructor类:表示一个类的构造函数。

获取类的构造函数
可以使用以下方法获取一个类的构造函数:

		//通过全类名加载类的Class对象
        Class cla = Class.forName("com.yyz.sercice.impl.BookServiceImpl");
        //Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法

		// 获取该类所有公共的构造函数(即public修饰的构造函数)的数组。
        Constructor[] constructors = cla.getConstructors();
        for (Constructor constructor : constructors) {
   
            System.out.println(constructor);
        }
		// 获取指定参数类型的构造函数
		Constructor constructor = cla.getConstructor(String.class, 		Integer.class);
		for (Constructor constructor1 : constructors) {
   
            System.out.println(constructor1);
        }
        //获取所有的构造函数
		 Constructor[] constructors1 = cla.getDeclaredConstructors();
        for (Constructor constructor : constructors1) {
   
            System.out.println(constructor);
        }
       

Method类:表示一个类的方法。



		//获取该类或接口中的public方法以及其父类中的public方法。
		 Method[] methods = cla.getMethods();
        for (Method method : methods) {
   
            System.out.println(method);
        }
        System.out.println("-------------");
        //获取该类或接口声明的所有方法(包括public、protected、default和private等)
        Method[] methods1 = cla.getDeclaredMethods();
        for (Method method : methods1) {
   
            System.out.println(method);
        }

Field类:表示一个类的属性。

 		Field[] fields = cla.getFields(); //只能获取public修饰的属性
        for (Field field : fields) {
   
            System.out.println(field);
        }
        System.out.println("-------------");
        Field[] fields1 = cla.getDeclaredFields(); //获取所有属性
        for (Field field : fields1) {
   
            System.out.println(field);
        }
        // 获取指定属性名的属性
		Field field = cla.getField("add");
		  System.out.println(field );

以下是使用Java反射的一些示例:

需要用到jar包jar包
hamcrest-core-1.3
junit-4.12
项目结构
在这里插入图片描述
先建BookDao接口

package com.yyz.dao;

public interface BookDao {
   
    public void  add();
}

然后 到impl

package com.yyz.dao.impl;

import com.yyz.dao.BookDao;

public class BookDaoImpl implements BookDao {
   
    @Override
    public void add() {
   
        System.out.println("BookDaoImpl...add");
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的甘蔗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值