BeanUtils源码解析
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
🍁 作者知识浅谈CSDN博客专家阿里云签约博主InfoQ签约博主华为云云享专家51CTO明日之星
📌 擅长领域全栈工程师、爬虫、ACM算法
💒 公众号知识浅谈
BeanUtils源码解析总结
🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
🎈BeanUtils源码相关函数
这个BeanUtils类的主要作用是JavaBeans 的静态便捷方法用于实例化 bean、检查 bean 属性类型、复制 bean 属性等。
🍮Log logger
含义这个成员变量使用于定义一个对象用于类中日志的生成。
通过往底层查找最后返回的事一个Log4jLog对象。
private static final Log logger = LogFactory.getLog(BeanUtils.class);
🍮Set<Class<?>> unknownEditorTypes
含义这个用于保存未知的编辑器类型。
private static final Set<Class<?>> unknownEditorTypes = Collections.newSetFromMap(new ConcurrentReferenceHashMap<>(64));
🍮DEFAULT_TYPE_VALUES
含义这个变量的含义就是用与存储默认的类型的值用于存储相应的类型以及对应的默认值如int 默认是0byte默认的为(byte)0
private static final Map<Class<?>, Object> DEFAULT_TYPE_VALUES;
🍮静态代码块
含义这个函数的含义就是把不同的类型已经其默认的值添加到map中并调用Collections.unmodifiableMap(values)把创建的map转化为一个不可修改的mapunmodifiableMap()这个函数会重新创建一个UnmodifiableMap类型的把values中的键值对传进去。
static {
Map<Class<?>, Object> values = new HashMap<>();
values.put(boolean.class, false);
values.put(byte.class, (byte) 0);
values.put(short.class, (short) 0);
values.put(int.class, 0);
values.put(long.class, (long) 0);
DEFAULT_TYPE_VALUES = Collections.unmodifiableMap(values);
}
🍮static T instantiate(Class clazz)
含义使用其无参数构造函数实例化类的便捷方法函数的开头显示一个Assert.notnull 断言表示对象非空然后再根据类型创建一个指定类的对象。
public static <T> T instantiate(Class<T> clazz) throws BeanInstantiationException {
Assert.notNull(clazz, "Class must not be null");
if (clazz.isInterface()) {
throw new BeanInstantiationException(clazz, "Specified class is an interface");
}
try {
return clazz.newInstance();
}
catch (InstantiationException ex) {
throw new BeanInstantiationException(clazz, "Is it an abstract class?", ex);
}
catch (IllegalAccessException ex) {
throw new BeanInstantiationException(clazz, "Is the constructor accessible?", ex);
}
}
🍮static T instantiateClass(Class clazz
使用其“主”构造函数对于 Kotlin 类可能声明了默认参数或其默认构造函数对于常规 Java 类需要标准的无参数设置实例化一个类其内部调用的函数instantiateClass也是调用构造器返回一个实例。
public static <T> T instantiateClass(Class<T> clazz) throws BeanInstantiationException {
Assert.notNull(clazz, "Class must not be null");
if (clazz.isInterface()) {
throw new BeanInstantiationException(clazz, "Specified class is an interface");
}
try {
return instantiateClass(clazz.getDeclaredConstructor());
}
catch (NoSuchMethodException ex) {
Constructor<T> ctor = findPrimaryConstructor(clazz);
if (ctor != null) {
return instantiateClass(ctor);
}
throw new BeanInstantiationException(clazz, "No default constructor found", ex);
}
catch (LinkageError err) {
throw new BeanInstantiationException(clazz, "Unresolvable class definition", err);
}
}
🍮Constructor findPrimaryConstructor(Class clazz)
含义这个函数主要是通过反射的方法找到传入的clazz这个类中有多少构造函数如无参构造函数不同参数和个数的构造函数。
public static <T> Constructor<T> findPrimaryConstructor(Class<T> clazz) {
Assert.notNull(clazz, "Class must not be null");
if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(clazz)) {
Constructor<T> kotlinPrimaryConstructor = KotlinDelegate.findPrimaryConstructor(clazz);
if (kotlinPrimaryConstructor != null) {
return kotlinPrimaryConstructor;
}
}
return null;
}
关于通过反射获取类中局部变量和方法的函数就不再多赘述最常用的的就是 BeanUtils中的opyProperties方法这个方法的作用就是把源对象中的向量拷贝到des对象中去。
BeanUtils.copyProperties(src,des);
🍚总结
以上是关于BeanUtils的简单总结希望有所帮助Written By 知识浅谈