Ioc
Ioc(Inverse of Control)概念
控制反转:将某一接口的实现类的选择控制权从调用类中移除,转交给第三方决定,即有Spring容器借由Bean配置来控制。
Ioc类型
从注入方法上划分,Ioc主要可划分为三种类型:构造函数注入、属性注入、接口注入。
.class文件介绍
Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获取Class的结构信息,如构造函数、属性、方法等。
类实例、类描述对象以及类装载器的关系:
类加载器ClassLoader
类加载器就是寻找类的字节码文件并构造出类在JVM中的元信息对象的组件。
类加载器把一个类装入JVM一般需要以下步骤:
- 装载:查找和导入Class文件。
- 链接:执行校验、准备和解析步骤、其中解析步骤是可选的。
- 校验:检查载入Class文件数据的正确性
- 准备:给静态变量分配存储空间。
- 解析:将符号引用转化为直接引用。
- 初始化:对类的静态变量、静态代码块进行初始化。(说明:非静态代码在类实例化时进行初始化)
ClassLoder及其子类
类装载工作由ClassLoader及其子类完成。ClassLoader是一个重要的Java运行时系统组件,他负责在运行时查找和装入Class字节码文件。
JVM在运行时会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类)以及AppClassLoader(应用类装载器)。
根装载器:不是ClassLoader的子类,是用C++编写的因此在java不可见。根装载器负责装载JRE的核心库。
ExtClassLoader:负责装载JRE扩展目录ext中的jar包。
AppClassLoader:负责装载ClassPath路径下的类包。
说明:根装载器时ExtClassLoader的父装载器、ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序。
示例:
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current:" + loader);
System.out.println("parent:" + loader.getParent());
System.out.println("grandparent:" + loader.getParent().getParent());
/*
* 输出结果 current:[email protected]
* parent:[email protected]
* grandparent:null
*/
}
}
JVM装载机制
JVM采用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显示的使用另一个ClassLoader,该类所有的依赖以及引用类都是有这个ClassLoader负责。“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找。
JAVA反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象。并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.lang.reflect包中定义。
主要的反射类:
Constructor:类的构造函数反射类。
Method:类方法的反射类。
Field:类的成员变量的反射类。