3.1.反射应用基础加强
3.1.1.如何理解反射?
反射是Java中特有的一种技术,是JAVA中自省特性的一种实现(对象运行时动态发现对象成员),可以基于此特性实现java的动态编程(例如对象创建,成员调用等).
3.1.2.反射的应用场景?
反射通常用于平台或框架编程,来实现更加通用的编程过程.例如:
1)框架中对象的构建.
2)框架中方法的调用.
框架中反射应用案例分享
1)对象创建
a)mybatis映射元素的resultType,resultMap等.
b)spring中的bean对象(,@Service,…)
2)方法调用
a)对象set方法,get方法,…
b)spring mvc 控制层方法,…
总之:“反射不能预知未来,但可驾驭未来”,通过反射可以更好构建一些编程框架,以实现通用性编程,从而达到简化代码编写。
FAQ:反射有什么缺陷?会存在一定的"性能"问题.
3.1.3.反射核心API及应用加强
反射应用的入口为"字节码对象",任意的一个类在同一个JVM内部,字节码对象是唯一的,此字节码对象会在第一次类加载时创建,用于存储类的结构信息(元数据信息).
基于字节码对象,我们可以获取如下对象:
1)Constructor (构造方法对象类型,基于此对象构建类的实例对象)
2)Field (属性对象类型)
3)Method (方法对象类型)
4)Annotation(注解对象类型)
5)…
反射案例应用分享:
基于字节码对象获取无参构造方法对象,并构建类的实例对象.
//基于类的字节码对象创建类的实例对象
private static <T>T doCreateInstance(Class<T> cls) throws Exception{
//1.获取类中的无参构造方法对象
Constructor<T> con=cls.getDeclaredConstructor();
//2.基于构造方法对象构建类的实例对象
con.setAccessible(true);//设置构造方法可访问
return con.newInstance();//默认调用无参构造函数
}
基于字节码对象获取带参构造方法对象,并构建类的实例对象.
@SuppressWarnings("unused")
private static <T>T doCreateInstance(
Class<T> cls,//字节码对象
Object[] args,//创建实例对象需要的实际参数
Class<?>[] paramTypes)throws Exception {
//1.获取构造方法对象
Constructor<T> con=
cls.getDeclaredConstructor(paramTypes);
//2.基于构造方法对象构建类的实例对象
return con.newInstance(args);
}
4.1.手写Spring简易工厂
4.1.1.需求分析
核心业务:基于配置文件中的描述,通过一个工厂构建对象实例,并存储实例,然后外界需要时,可以让外界通过特定方法获取需要的实例对象.业务架构如下:
其中:
1)spring-configs.xml为配置文件
2)Map<String,BeanDefinition>用于存储配置文件信息
3)Map<String,Object>用于存储基于配置信息创建的实例.
4.1.2.业务设计
1.业务实现过程设计