0
点赞
收藏
分享

微信扫一扫

【commons-beanutils专题】005- ConvertUtils 专题


【commons-beanutils专题】005- ConvertUtils 专题

文章目录

  • ​​【commons-beanutils专题】005- ConvertUtils 专题​​
  • ​​一、准备​​
  • ​​0、ConvertUtils 主要作用​​
  • ​​1、引入 commons-beanutils 依赖​​
  • ​​2、pom.xml 文件​​
  • ​​3、实体类​​
  • ​​Cat​​
  • ​​CatDto​​
  • ​​4、自定义转换器​​
  • ​​5、前置代码​​
  • ​​二、类型转换​​
  • ​​1、将对象转换为字符串​​
  • ​​2、将字符串转换为指定数据类型对象​​
  • ​​3、将指定值的数组转换为指定类的对象数组(如果可能)​​
  • ​​4、将对象转换为指定数据类型对象​​
  • ​​5、基本类型转换成包装类​​
  • ​​三、转换器​​
  • ​​1、注册自定义转换器​​
  • ​​2、查找指定类型的转换器​​
  • ​​3、查找将指定类型转换为另一种类型的转换器​​
  • ​​4、移除指定类型的转换器​​
  • ​​5、移除所有已经注册的转换器​​
  • ​​四、完整代码​​

一、准备

0、ConvertUtils 主要作用

主要用于类型转换,可自定义转换器!

1、引入 commons-beanutils 依赖

<!--引入依赖commons-beanutils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>

2、pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zibo</groupId>
<artifactId>zibo2022</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zibo2022</name>
<description>zibo2022</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!--引入依赖commons-beanutils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>

3、实体类

Cat

package com.zibo.zibo2022.convert_utils.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat {

private String name;

private Integer age;

}

CatDto

package com.zibo.zibo2022.convert_utils.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* @author zibo
* @date 2022/7/20 0020 18:56
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CatDto {

private String name;

private Integer age;

}

4、自定义转换器

package com.zibo.zibo2022.convert_utils.converter;

import com.zibo.zibo2022.convert_utils.entity.Cat;
import com.zibo.zibo2022.convert_utils.entity.CatDto;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.PropertyUtils;

/**
* 此处简单写一个转换器,用于将 Cat 对象转换为 CatDto 对象
*
* @author zibo
* @date 2022/7/20 0020 19:00
*/
public class CatConverter implements Converter {
@Override
public <T> T convert(Class<T> type, Object value) {
try {
if (!(value instanceof Cat)) {
throw new IllegalArgumentException("参数类型错误!");
}
if (type != CatDto.class) {
throw new IllegalArgumentException("参数类型错误!");
}
String name = (String) PropertyUtils.getProperty(value, "name");
Integer age = (Integer) PropertyUtils.getProperty(value, "age");
T newInstance = type.getDeclaredConstructor().newInstance();
PropertyUtils.setProperty(newInstance, "name", name);
PropertyUtils.setProperty(newInstance, "age", age);
return newInstance;
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | InstantiationException e) {
throw new RuntimeException(e);
}
}
}

5、前置代码

Cat cat = new Cat("小猫", 1);
Cat cat2 = new Cat("小猫2", 2);

二、类型转换

1、将对象转换为字符串

// 1、将对象转换为字符串
String convert = ConvertUtils.convert(cat);
System.out.println(convert); // Cat(name=小猫, age=1)
// 下面的内容是值得注意的,如果是数组,只转换第一个元素
String convert20 = ConvertUtils.convert(new Cat[] {cat, cat2});
System.out.println(convert20); // Cat(name=小猫, age=1)
String convert40 = ConvertUtils.convert(new String[] {"小猫", "1", "随便写的内容"});
System.out.println(convert40);
String convert10 = ConvertUtils.convert(new Long[] {1L, 2L, 3L});
System.out.println(convert10); // 1

2、将字符串转换为指定数据类型对象

// 2、将字符串转换为指定数据类型对象
String one = "1";
Integer convert1 = (Integer) ConvertUtils.convert(one, Integer.class);
System.out.println(convert1); // 1
Object convert2 = ConvertUtils.convert(one, Boolean.class);
System.out.println(convert2); // true
Object convert4 = ConvertUtils.convert("true", Boolean.class);
System.out.println(convert4); // true
Integer[] convert5 = (Integer[]) ConvertUtils.convert("[1, 2, 3]", Integer[].class);
for (Integer integer : convert5) {
System.out.println(integer);
}
// 1
// 2
// 3
// 下面无法转换!!!
// Cat convert6 = (Cat)ConvertUtils.convert("Cat(name=小猫, age=1)", Cat.class);
// System.out.println(convert6);
// org.apache.commons.beanutils.ConversionException: Default conversion to com.zibo.zibo2022.convert_utils.entity.Cat failed.

3、将指定值的数组转换为指定类的对象数组(如果可能)

// 3、将指定值的数组转换为指定类的对象数组(如果可能)
String[] array = {"吃老鼠", "吃鱼"};
String[] convert3 = (String[]) ConvertUtils.convert(array, String.class);
System.out.println(Arrays.toString(convert3)); // [吃老鼠, 吃鱼]
String[] arr = {"true", "false"};
Boolean[] conver4 = (Boolean[]) ConvertUtils.convert(arr, Boolean.class);
System.out.println(Arrays.toString(conver4)); // [true, false]

4、将对象转换为指定数据类型对象

// 4、将对象转换为指定数据类型对象
Boolean convert7 = (Boolean) ConvertUtils.convert("true", Boolean.class);
System.out.println(convert7); // true

5、基本类型转换成包装类

// 10、基本类型转换成包装类
int i = 1;
Integer i2 = (Integer) ConvertUtils.convert(i, Integer.class);
System.out.println(i2); // 1

三、转换器

1、注册自定义转换器

转换器见准备部分!

// 5、注册转换器
// 这里是自定义转换器,然后注册
ConvertUtils.register(new CatConverter(), Cat.class);
CatConverter catConverter = new CatConverter();
CatDto catDto = catConverter.convert(CatDto.class, cat);
System.out.println(catDto); // CatDto(name=小猫, age=1)

2、查找指定类型的转换器

// 6、查找指定类型的转换器
Converter lookup = ConvertUtils.lookup(Cat.class);
System.out.println(lookup); // com.zibo.zibo2022.convert_utils.converter.CatConverter@523884b2

3、查找将指定类型转换为另一种类型的转换器

// 7、查找将指定类型转换为另一种类型的转换器
Converter lookup2 = ConvertUtils.lookup(String.class, Boolean.class);
System.out.println(lookup2); // ConverterFacade[BooleanConverter[UseDefault=true]]
Converter converter = ConvertUtils.lookup(CatDto.class, Cat.class);
System.out.println(converter); // com.zibo.zibo2022.convert_utils.converter.CatConverter@523884b2
// 注意下面
Converter lookup3 = ConvertUtils.lookup(Cat.class, CatDto.class);
System.out.println(lookup3); // null

4、移除指定类型的转换器

// 8、移除指定类型的转换器
ConvertUtils.deregister(Cat.class);
Converter converter1 = ConvertUtils.lookup(CatDto.class, Cat.class);
System.out.println(converter1); // null

5、移除所有已经注册的转换器

// 9、移除所有已经注册的转换器
ConvertUtils.deregister();

四、完整代码

package com.zibo.zibo2022.convert_utils.main;

import com.zibo.zibo2022.convert_utils.converter.CatConverter;
import com.zibo.zibo2022.convert_utils.entity.Cat;
import com.zibo.zibo2022.convert_utils.entity.CatDto;
import java.util.Arrays;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

public class Main {

public static void main(String[] args) {
Cat cat = new Cat("小猫", 1);
Cat cat2 = new Cat("小猫2", 2);

// 1、将对象转换为字符串
String convert = ConvertUtils.convert(cat);
System.out.println(convert); // Cat(name=小猫, age=1)
// 下面的内容是值得注意的,如果是数组,只转换第一个元素
String convert20 = ConvertUtils.convert(new Cat[] {cat, cat2});
System.out.println(convert20); // Cat(name=小猫, age=1)
String convert40 = ConvertUtils.convert(new String[] {"小猫", "1", "随便写的内容"});
System.out.println(convert40);
String convert10 = ConvertUtils.convert(new Long[] {1L, 2L, 3L});
System.out.println(convert10); // 1

// 2、将字符串转换为指定数据类型对象
String one = "1";
Integer convert1 = (Integer) ConvertUtils.convert(one, Integer.class);
System.out.println(convert1); // 1
Object convert2 = ConvertUtils.convert(one, Boolean.class);
System.out.println(convert2); // true
Object convert4 = ConvertUtils.convert("true", Boolean.class);
System.out.println(convert4); // true
Integer[] convert5 = (Integer[]) ConvertUtils.convert("[1, 2, 3]", Integer[].class);
for (Integer integer : convert5) {
System.out.println(integer);
}
// 1
// 2
// 3
// 下面无法转换!!!
// Cat convert6 = (Cat)ConvertUtils.convert("Cat(name=小猫, age=1)", Cat.class);
// System.out.println(convert6);
// org.apache.commons.beanutils.ConversionException: Default conversion to com.zibo.zibo2022.convert_utils.entity.Cat failed.

// 3、将指定值的数组转换为指定类的对象数组(如果可能)
String[] array = {"吃老鼠", "吃鱼"};
String[] convert3 = (String[]) ConvertUtils.convert(array, String.class);
System.out.println(Arrays.toString(convert3)); // [吃老鼠, 吃鱼]
String[] arr = {"true", "false"};
Boolean[] conver4 = (Boolean[]) ConvertUtils.convert(arr, Boolean.class);
System.out.println(Arrays.toString(conver4)); // [true, false]

// 4、将对象转换为指定数据类型对象
Boolean convert7 = (Boolean) ConvertUtils.convert("true", Boolean.class);
System.out.println(convert7); // true

// 5、注册转换器
// 这里是自定义转换器,然后注册
ConvertUtils.register(new CatConverter(), Cat.class);
CatConverter catConverter = new CatConverter();
CatDto catDto = catConverter.convert(CatDto.class, cat);
System.out.println(catDto); // CatDto(name=小猫, age=1)

// 6、查找指定类型的转换器
Converter lookup = ConvertUtils.lookup(Cat.class);
System.out.println(lookup); // com.zibo.zibo2022.convert_utils.converter.CatConverter@523884b2

// 7、查找将指定类型转换为另一种类型的转换器
Converter lookup2 = ConvertUtils.lookup(String.class, Boolean.class);
System.out.println(lookup2); // ConverterFacade[BooleanConverter[UseDefault=true]]
Converter converter = ConvertUtils.lookup(CatDto.class, Cat.class);
System.out.println(converter); // com.zibo.zibo2022.convert_utils.converter.CatConverter@523884b2
// 注意下面
Converter lookup3 = ConvertUtils.lookup(Cat.class, CatDto.class);
System.out.println(lookup3); // null

// 8、移除指定类型的转换器
ConvertUtils.deregister(Cat.class);
Converter converter1 = ConvertUtils.lookup(CatDto.class, Cat.class);
System.out.println(converter1); // null

// 9、移除所有已经注册的转换器
ConvertUtils.deregister();

// 10、基本类型转换成包装类
int i = 1;
Integer i2 = (Integer) ConvertUtils.convert(i, Integer.class);
System.out.println(i2); // 1
}

}


举报

相关推荐

0 条评论