1.Spring通过读取配置文件生成对象原理
通过反射创建对象
2种方式:
1.使用Class对象的newInstance()创建该Class对象对应类的实例(要求改Class对应类有默认构造器)
2.先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法创建该Class对象对应类的实例
--- 该方式,可选择指定的构造器来创建实例
2.关于反射机制
Java反射,可以知道Java类的内部构造,就可以与它进行交互,包括创建新的对象和调用对象中的方法等。
这种交互方式与直接在源代码中使用的效果是相同的,但是又额外提供了运行时刻的灵活性。使用反射的一个最大的弊端是性能比较差
每个类被加载进内存后,系统就会为该类生成一个对应的 java.lang.Class对象,通过该Class对象即可访问到JVM中的这个类
加载完类之后,在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类结构信息,这个Class对象就像一面镜子,可以看到类的结构
程序在运行状态中,可以动态加载一个只有名称的类(全路径),对于任意一个已经加载的类,都能够知道这个类的所有属性和方法,
对于任意一个对象,都能调用它的任意一个方法和属性
用法:
作用1:获取类的内部结构
Java反射API可以获取程序在运行时刻的内部结构,只需短短十几行代码,就可遍历出一个Java类的内部结构,包括:构造方法、声明的域和定义的方法等
java.lang.Class类的对象,可以通过其中的方法来获取到该类中的构造方法、域和方法(getConstructor、getFiled、getMethod)
这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。
Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。
作用2:运行时刻,对一个Java对象进行操作
动态创建一个Java类的对象,获取某个属性的值和调用某个方法
在Java源码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现
特别说明:
clazz.setAccessible(true) --- 可以获取到类中的private属性和private方法
Class对象的获取
1.对象的 getClass()方法
2.类.class属性 --- 最安全,性能最好
3.Class.forName(String classFullName) 动态加载类 --- classFullName是类的全限定名(包.类名) --- 最常用
从Class中获取信息
1.获取信息
构造器、包含方法、包含属性、包含的Annotation、实现的接口,所在包,类名,简称,修饰符等
获取内容 方法签名
构造器 Constructor<T> getConstructor(Class<?>... parameterTypes)
包含的方法