前言
Optional
指的是JDK 8的java.util.Optional
。我在阅读源码时发现了Spring
是使用反射和静态代码块实现了当前JDK是否支持Optional
的判断。关键类是org.springframework.beans.factory.support.DefaultListableBeanFactory
。
关键代码
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
/**
* java.util.Optional的Class对象,用于判断当前JDK是否支持Optional
*/
private static Class<?> javaUtilOptionalClass = null;
/**
*javax.inject.Provider的Class对象,用于判断当前类路径是否有JSR-330的API
*/
private static Class<?> javaxInjectProviderClass = null;
static {
try {
//使用反射获取Class对象
javaUtilOptionalClass =
ClassUtils.forName("java.util.Optional", DefaultListableBeanFactory.class.getClassLoader());
}
catch (ClassNotFoundException ex) {
// 捕获到异常则表示当前JDK不为Java 8,不支持Optional
}
try {
javaxInjectProviderClass =
ClassUtils.forName("javax.inject.Provider", DefaultListableBeanFactory.class.getClassLoader());
}
catch (ClassNotFoundException ex) {
// 捕获到异常则表示当前类路径不存在JSR-330的API
}
}
// 省略无关代码
}
分析
- 通过类变量(静态变量)和静态代码块将特性支持的识别的操作控制在对象构造前。
- 通过反射机制的使用类名加载
Class
对象来进行特性支持的识别