java的反射机制和spring框架的IoC和DI
java反射机制概述:
java反射机制是指在运行时动态地获取类的信息并对其进行操作的能力。Java反射允许程序员在编写代码时不需要了解类的内部结构,而可以通过反射机制获取类名、属性、方法等信息,并根据这些信息来创建对象、调用方法或者修改属性值。
简而言之就是 JAVA反射是框架的灵魂!
要想使用反射就得获取到代码编译后的字节码文件就是.class文件
Java反射的优点
- 动态创建一个对象,而不必知道它的具体类名。
- 在运行时判断对象所属的类,从而动态地调用该类的方法。
- 在运行时获取类的所有成员变量和方法,包括私有的。
- 可以调用一个对象的方法并改变其属性值。
- 方便编写泛型代码。
Java反射机制被广泛应用于以下场景:
- 框架设计:框架中需要大量使用反射来实现动态加载类、注入依赖等功能。
- 插件开发:利用反射可以动态加载插件提供的类,并调用Plugin接口中定义的方法。
- 代码生成:通过读取注解、XML等文件,结合反射机制,可以实现很多自动生成代码的工具。
- 调试工具:通过反射机制可以查看一个类的所有方法和属性,帮助我们更好地理解类的行为。
- 单元测试:反射机制可以方便地调用类中的私有方法和属性,进行单元测试。
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");