BeanUtils源码解析

news/2024/10/31 3:25:31/

🍁 作者:知识浅谈,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 默认是0,byte默认的为(byte)0
private static final Map<Class<?>, Object> DEFAULT_TYPE_VALUES;

🍮静态代码块

含义:这个函数的含义就是把不同的类型已经其默认的值添加到map中,并调用Collections.unmodifiableMap(values),把创建的map转化为一个不可修改的map,unmodifiableMap()这个函数会重新创建一个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 知识浅谈


http://www.ppmy.cn/news/21374.html

相关文章

Axios网络请求

哈喽~大家好&#xff0c;这篇来看看Axios网络请求。 ​文章推荐链接SpringCloud Sentinel 使用SpringCloud Sentinel 使用将Nacos注册到springboot使用以及Feign实现服务调用将Nacos注册到springboot使用以及Feign实现服务调用微服务介绍与 SpringCloud Eureka微服务介绍与 Sp…

Java程序设计实验3 | 面向对象(上)

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 目录 一、实验…

OAuth2介绍

目录 一、什么是OAuth2 二、OAuth2中的角色 三、认证流程 四、令牌的特点 五、OAuth2授权方式 授权码 隐藏方式 密码方式 凭证方式 一、什么是OAuth2.0 概念&#xff1a;第三方授权解决方案 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取…

【Redis】.net core 3.1 Redis安装和简单使用

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 简单来说&#xff0c;就是一个键值对数据库。 Redis支持的…

【DataX】datax | datax-web | win搭建datax-web环境

一、环境准备 1、jdk8 2、maven 3、mysql7 4、python3 5、window10 6、idea 7、2345解压&#xff08;win支持tar.gz解压&#xff09; 8、git 二、操作步骤 1、datax操作步骤 1&#xff09;下载datax http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 2&am…

maxcomputer的分区表相关操作

– 查看xsxw(学生行为表定义) desc xsxw; – 查看xsxw1(学生行为表定义) desc xsxw1; – 上面的两张表是通过ddl语句创建的分区表 – 创建ddl语句如下 – CREATE TABLE IF NOT EXISTS xsxw1( – xwsj STRING COMMENT ‘行为时间’, – xh STRING COMMENT ‘学号’, – xwdd ST…

关于Vue中Diff算法详解

一、(Diff)是什么? diff 算法是一种通过同层的树节点进行比较的高效算法 1.1. 特点&#xff1a; 比较只会在同层级进行, 不会跨层级比较在diff比较的过程中&#xff0c;循环从两边向中间比较diff 算法的在很多场景下都有应用&#xff0c;在 vue 中&#xff0c;作用于虚拟 dom…

Pytorch安装及环境配置详细教程(CUDA版本)

文章目录前言一、查看GPU支持的CUDA版本二、安装CUDA三、确定torch、torchvision和python版本四、安装anaconda五、安装torch和torchvision前言 安装cuda版本的pytorch时踩了不少坑&#xff0c;网上安装pytorch的版本很多&#xff0c;一般的教程都是到pytorch的官网&#xff0…