前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BeanUtils源码解析

BeanUtils源码解析

作者头像
知识浅谈
发布2023-03-16 15:53:21
2810
发布2023-03-16 15:53:21
举报
文章被收录于专栏:分享学习

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中的键值对传进去。

代码语言:javascript
复制
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 断言表示对象非空,然后再根据类型创建一个指定类的对象。

代码语言:javascript
复制
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也是调用构造器返回一个实例。

代码语言:javascript
复制
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这个类中有多少构造函数,如无参构造函数,不同参数和个数的构造函数。

代码语言:javascript
复制
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 知识浅谈

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🎈BeanUtils源码相关函数
    • 🍮Log logger
      • 🍮Set<Class<?>> unknownEditorTypes
        • 🍮DEFAULT_TYPE_VALUES
          • 🍮静态代码块
            • 🍮static T instantiate(Class clazz)
              • 🍮static T instantiateClass(Class clazz)
                • 🍮Constructor findPrimaryConstructor(Class clazz)
                • 🍚总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档