- 1. 通过反射创建对象
- 2. 工厂模式定义
- 3. IOC底层原理简述
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java.lang.reflect 包下的反射 API:
- Class类:代表一个类,位于 java.lang 包下
- Field类:代表类的成员变量
- Method类:代表类的方法
- Constructor类:代表类的构造方法
使用Class类的 forName(String clazzName) 静态方法可以获取Class对象。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名。
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class> class = Class.forName("com.example.redislock.reflect.Person");
}
}
一旦获得了某个类所对应的Class对象之后,程序就可以调用Class对象的方法来获得该对象和该类的真实信息。Class类提供了大量的实例方法来获取该Class对象所对应类的详细信息。
Class对象可以获得该类里的方法(由Method对象表示)、构造器(由Constructor对象表示)、Field(由 Field 对象表示),这 3个类都位于java.lang.reflect 包下。程序可以通过Method 对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建实例,能通过Field对象直接访问并修改对象的属性值。
class Solution {
public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
// Class类对象
Class> personClass = Class.forName("com.example.redislock.reflect.Person");
// 构造方法,Constructor类
Constructor constructor = personClass.getConstructor(String.class, Integer.class);
// 方法,Method类
Method method = personClass.getMethod("toString", String.class);
// 属性,Field类
Field field = personClass.getField("name");
}
}
2. 工厂模式定义
工厂方法模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
在工厂方法模式中:
-
抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;
-
Creator为抽象创建类,也就是抽象工厂;
-
具体如何创建产品类是由具体的实现工厂ConcreteCreator完成;
抽象产品类Product负责定义产品的共性 :
public abstract class Procuct {
// 抽象方法,子类实现
public abstract void method1();
// 公共方法
public void method2(){
}
}
具体要创建的产品类:
public class ConcreteProduct2 extends Product {
@Override
public void method2() {
}
}
public class ConcreteProduct2 extends Procuct{
@Override
public void method1() {
}
}
抽象工厂类:
public abstract class Creator {
public abstract T createProduct(Class c);
}
抽象工厂实现类,用于创建具体的Product类:
public class ConcreteCreator extends Creator{
@Override
public T createProduct(Class t) {
Procuct procuct = null;
// 类名.class.getName()的作用是获取这个类的全类名
try {
procuct =(Procuct) Class.forName(t.getName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return (T) procuct;
}
}
public class Main {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
ConcreteProduct product = creator.createProduct(ConcreteProduct.class);
}
}
类名.class.getName()的作用:
public class Main {
public static void main(String[] args) {
// 输出:com.example.test6.ConcreteProduct
System.out.println(ConcreteProduct.class.getName());
}
}
简单工厂模式:一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法就可以了。
public class ConcreteCreator{
public static T createProduct(Class t) {
Procuct procuct = null;
// 类名.class.getName()的作用是获取这个类的全类名
try {
procuct =(Procuct) Class.forName(t.getName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return (T) procuct;
}
}
public class Main {
public static void main(String[] args) {
ConcreteProduct product = ConcreteCreator.createProduct(ConcreteProduct.class);
}
}
3. IOC底层原理简述
什么是 IOC:
(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理;
(2)使用 IOC 目的:为了耦合度降低;
IOC 底层原理涉及技术:xml 解析、工厂模式、反射
① 在bean.xml文件中配置要创建的对象
② 工厂模式创建对象
class UserFactory{
public static UserDao getUserDao(){
// 第一步:解析XML文件,获取class类的全类名,
String clazzName = "com.chahua.spring.User";
// 第二步:通过反射创建对象
Class clazz = Class.forName(clazzName);
UserDao userDao = (UserDao)clazz.newInstance();
return userDao;
}
}
Spring 提供 IOC 容器实现两种方式:
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用。加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象。
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。加载配置文件时候就会把在配置文件对象进行创建。



