• Java中17个提高开发效率的小工具代码


    目录

    1.Collections

    1.1排序

    1.2获取最大或最小值

    1.3转换线程安全集合

     1.4返回空集合

    1.5二分查找

    1.6转换成不可修改集合

     2.CollectionUtils

    2.1集合判空

    2.2对两个集合进行操作

    3.Lists

    3.1创建空集合

    3.2快速初始化集合

    3.3笛卡尔积

    3.4分页

    3.5流处理

    3.6颠倒顺序

    4.Objects

    4.1对象判空

    4.2对象为空抛异常

    4.3判断两个对象是否相等

    4.4获取对象的 hashCode

    5.BooleanUtils

    5.1判断 true 或 false

     5.3转换成数字

    5.4Boolean 转换成布尔值

     6.StringUtils

    6.1字符串判空

    6.2分隔字符串

    6.3判断是否纯数字

    6.4将集合拼接成字符串

    7.Assert

    7.1断言参数是否为空

     8.IOUtils

     8.1读取文件

     8.2写入文件

    8.3文件拷贝

    8.4读取文件内容到字节数组

    9.MDC

    10.ClassUtils

    10.1获取对象的所有接口

    10.2获取某个类的包名

    10.3判断某个类是否内部类

    10.4判断对象是否代理对象

    11.BeanUtils

    11.1拷贝对象的属性

    11.2实例化某个类

    11.3获取指定类的指定方法

    11.4获取指定方法的参数

    12.ReflectionUtils 

    12.1获取方法

    12.2获取字段

    12.3执行方法

    12.4判断字段是否常量

    12.5判断是否 equals 方法

    13.Base64Utils

    14.StandardCharsets

    15.DigestUtils

    15.1md5加密

    15.2sha256 加密

    16.SerializationUtils

    17.HttpStatus


    1.Collections

    1.1排序

    在工作中经常有对集合排序的需求。

    看看使用Collections工具是如何实现升序和降序的:

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. Collections.sort(list);//升序
    6. System.out.println(list);
    7. Collections.reverse(list);//降序
    8. System.out.println(list);

    执行结果:

    1. [1, 2, 3]
    2. [3, 2, 1]

    1.2获取最大或最小值

    有时候需要找出集合中的最大值或者最小值,这时可以使用 Collections 的maxmin方法。例如:

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. Integer max = Collections.max(list);//获取最大值
    6. Integer min = Collections.min(list);//获取最小值
    7. System.out.println(max);
    8. System.out.println(min);

    执行结果:

    1. 3
    2. 1

    1.3转换线程安全集合

    我们都知道,java 中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet 等,都是线程不安全的。

    换句话说,这些集合在多线程的环境中,添加数据会出现异常。

    这时,可以用 Collections 的synchronizedxxx方法,将这些线程不安全的集合,直接转换成线程安全集合。例如:

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. List<Integer> integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
    6. System.out.println(integers);

    它的底层会创建SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized加锁。

     1.4返回空集合

    有时,我们在判空之后,需要返回空集合,就可以使用emptyList方法,例如:

    1. private List<Integer> fun(List<Integer> list) {
    2. if (list == null || list.size() == 0) {
    3. return Collections.emptyList();
    4. }
    5. //业务处理
    6. return list;
    7. }

    1.5二分查找

     binarySearch方法提供了一个非常好用的二分查找功能,只要传入指定集合和需要找到的 key 即可。例如:

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. int i = Collections.binarySearch(list, 3);//二分查找
    6. System.out.println(i );

    执行结果:

    2

    1.6转换成不可修改集合

    为了防止后续的程序把某个集合的结果修改了,有时候我们需要把某个集合定义成不可修改的,使用 Collections 的unmodifiablexxx方法就能轻松实现:

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. List<Integer> integers = Collections.unmodifiableList(list);
    6. integers.add(4);
    7. System.out.println(integers);

    执行结果:

    1. Exception in thread "main" java.lang.UnsupportedOperationException
    2. at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
    3. at com.sue.jump.service.test1.UtilTest.main(UtilTest.java:19)

    当然 Collections 工具类中还有很多常用的方法,在这里就不一一介绍了,需要的可以自己去探索。

     

     2.CollectionUtils

    对集合操作,除了前面说的Collections工具类之外,CollectionUtils工具类也非常常用。

    目前比较主流的有两个。一个是springorg.springframework.util包下的 CollectionUtils 工具类。

     另一个是apacheorg.apache.commons.collections包下的 CollectionUtils 工具类。

    我个人更推荐使用 apache 的 CollectionUtils 工具类,因为它的工具更多更全面。

    举个简单的例子,spring的 CollectionUtils 工具类没有判断集合不为空的方法。而apache的 CollectionUtils 工具类却有。

    下面我们以apache的 CollectionUtils 工具类为例,介绍一下常用方法。

    2.1集合判空

    通过 CollectionUtils 工具类的isEmpty方法可以轻松判断集合是否为空,isNotEmpty方法判断集合不为空。

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. if (CollectionUtils.isEmpty(list)) {
    6. System.out.println("集合为空");
    7. }
    8. if (CollectionUtils.isNotEmpty(list)) {
    9. System.out.println("集合不为空");
    10. }

    2.2对两个集合进行操作

    有时候我们需要对已有的两个集合进行操作,比如取交集或者并集等。

    1. List<Integer> list = new ArrayList<>();
    2. list.add(2);
    3. list.add(1);
    4. list.add(3);
    5. List<Integer> list2 = new ArrayList<>();
    6. list2.add(2);
    7. list2.add(4);
    8. //获取并集
    9. Collection<Integer> unionList = CollectionUtils.union(list, list2);
    10. System.out.println(unionList);
    11. //获取交集
    12. Collection<Integer> intersectionList = CollectionUtils.intersection(list, list2);
    13. System.out.println(intersectionList);
    14. //获取交集的补集
    15. Collection<Integer> disjunctionList = CollectionUtils.disjunction(list, list2);
    16. System.out.println(disjunctionList);
    17. //获取差集
    18. Collection<Integer> subtractList = CollectionUtils.subtract(list, list2);
    19. System.out.println(subtractList);

    执行结果:

    1. [1, 2, 3, 4]
    2. [2]
    3. [1, 3, 4]
    4. [1, 3]

    说句实话,对两个集合的操作,在实际工作中用得挺多的,特别是很多批量的场景中。以前我们需要写一堆代码,但没想到有现成的轮子。

    3.Lists

    如果你引入com.google.guava的 pom 文件,会获得很多好用的小工具。这里推荐一款com.google.common.collect包下的集合工具:Lists

    它实在太好用了,让人爱不释手。

    3.1创建空集合

    有时候,我们想创建一个空集合。这时可以用 Lists 的newArrayList方法,例如:

    List<Integer> list = Lists.newArrayList();

    3.2快速初始化集合

    有时候,我们想给一个集合中初始化一些元素。这时可以用 Lists 的 newArrayList 方法,例如:

    List<Integer> list = Lists.newArrayList(1, 2, 3);

    执行结果:

    [1, 2, 3]

    3.3笛卡尔积

     如果你想将两个集合做笛卡尔积,Lists 的cartesianProduct方法可以帮你实现:

    1. List<Integer> list1 = Lists.newArrayList(1, 2, 3);
    2. List<Integer> list2 = Lists.newArrayList(4,5);
    3. List<List<Integer>> productList = Lists.cartesianProduct(list1,list2);
    4. System.out.println(productList);

    执行结果:

    [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]

    3.4分页

    如果你想将一个大集合分成若干个小集合,可以使用 Lists 的partition方法:

    1. List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
    2. List<List<Integer>> partitionList = Lists.partition(list, 2);
    3. System.out.println(partitionList);

    执行结果:

    [[1, 2], [3, 4], [5]]

    这个例子中,list 有 5 条数据,我将 list 集合按大小为 2,分成了 3 页,即变成 3 个小集合。

    这个是我最喜欢的方法之一,经常在项目中使用。

    比如有个需求:现在有 5000 个 id,需要调用批量用户查询接口,查出用户数据。但如果你直接查 5000 个用户,单次接口响应时间可能会非常慢。如果改成分页处理,每次只查 500 个用户,异步调用 10 次接口,就不会有单次接口响应慢的问题。

    3.5流处理

     如果我们想把某个集合转换成另外一个接口,可以使用 Lists 的transform方法。例如:

    1. List<String> list = Lists.newArrayList("a","b","c");
    2. List<String> transformList = Lists.transform(list, x -> x.toUpperCase());
    3. System.out.println(transformList);

    将小写字母转换成了大写字母。

    3.6颠倒顺序

    Lists 有颠倒顺序的方法reverse。例如:

    1. List<Integer> list = Lists.newArrayList(3, 1, 2);
    2. List<Integer> reverseList = Lists.reverse(list);
    3. System.out.println(reverseList);

    执行结果:

    [2, 1, 3]

    list 的原始顺序是 312,使用reverse方法颠倒顺序之后,变成了 213。 

    Lists 还有其他的好用的工具,这里只是抛砖引玉,有兴趣的朋友,可以仔细研究一下。

    4.Objects

    jdk7之后,提供了Objects工具类,我们可以通过它操作对象。

    4.1对象判空

    在 Java 中万事万物皆对象,对象的判空可以说无处不在。Objects 的isNull方法判断对象是否为空,而nonNull方法判断对象是否不为空。例如:

    1. Integer integer = new Integer(1);
    2. if (Objects.isNull(integer)) {
    3. System.out.println("对象为空");
    4. }
    5. if (Objects.nonNull(integer)) {
    6. System.out.println("对象不为空");
    7. }

    4.2对象为空抛异常

     如果我们想在对象为空时,抛出空指针异常,可以使用 Objects 的requireNonNull方法。例如:

    1. Integer integer1 = new Integer(128);
    2. Objects.requireNonNull(integer1);
    3. Objects.requireNonNull(integer1, "参数不能为空");
    4. Objects.requireNonNull(integer1, () -> "参数不能为空");

    4.3判断两个对象是否相等

     我们经常需要判断两个对象是否相等,Objects 给我们提供了equals方法,能非常方便地实现:

    1. Integer integer1 = new Integer(1);
    2. Integer integer2 = new Integer(1);
    3. System.out.println(Objects.equals(integer1, integer2));

    执行结果:

    true

    但使用这个方法有坑,比如例子改成:

    1. Integer integer1 = new Integer(1);
    2. Long integer2 = new Long(1);
    3. System.out.println(Objects.equals(integer1, integer2));

    执行结果:

    false

    4.4获取对象的 hashCode

    如果你想获取某个对象的 hashCode,可以使用 Objects 的hashCode方法。例如:

    1. String str = new String("abc");
    2. System.out.println(Objects.hashCode(str));

    执行结果:

    96354

    Objects 的内容还有很多,有兴趣的小伙们,可以看看下面更多的方法。

    5.BooleanUtils

    在 Java 中,布尔值随处可见。

    如果你使用了布尔的包装类:Boolean,总感觉有点麻烦,因为它有三种值:nulltruefalse。我们在处理 Boolean 对象时,需要经常判空。

    头疼!!!

    但如果使用BooleanUtils类处理布尔值,心情一下子就愉悦起来了。

    5.1判断 true 或 false

    有时候,需要判断某个参数不为 true,即是 null 或者 false。或者判断不为 false,即是 null 或者 true。

    可以使用isNotTrueisNotFalse方法。例如:

    1. Boolean aBoolean = new Boolean(true);
    2. Boolean aBoolean1 = null;
    3. System.out.println(BooleanUtils.isNotTrue(aBoolean));
    4. System.out.println(BooleanUtils.isNotTrue(aBoolean1));
    5. System.out.println(BooleanUtils.isNotFalse(aBoolean));
    6. System.out.println(BooleanUtils.isNotFalse(aBoolean1));

     执行结果:

    1. false
    2. true
    3. true
    4. true

     5.3转换成数字

     如果你想将 true 转换成数字 1,false 转换成数字 0,可以使用toInteger方法:

    1. Boolean aBoolean = new Boolean(true);
    2. Boolean aBoolean1 = new Boolean(false);
    3. System.out.println(BooleanUtils.toInteger(aBoolean));
    4. System.out.println(BooleanUtils.toInteger(aBoolean1));

    执行结果:

    1. 1
    2. 0

    5.4Boolean 转换成布尔值

    我们有时候需要将包装类Boolean对象,转换成原始的boolean对象,可以使用toBoolean方法。例如:

    1. Boolean aBoolean = new Boolean(true);
    2. Boolean aBoolean1 = null;
    3. System.out.println(BooleanUtils.toBoolean(aBoolean));
    4. System.out.println(BooleanUtils.toBoolean(aBoolean1));
    5. System.out.println(BooleanUtils.toBooleanDefaultIfNull(aBoolean1, false));

    我们无需额外地判空了,而且还可以设置 Boolean 对象为空时返回的默认值。

    BooleanUtils 类的方法还有很多,有兴趣的小伙伴可以看看下面的内容。

     6.StringUtils

    字符串(String)在我们的日常工作中,用得非常非常非常多。

    在我们的代码中经常需要对字符串判空,截取字符串、转换大小写、分隔字符串、比较字符串、去掉多余空格、拼接字符串、使用正则表达式等等。

    如果只用 String 类提供的那些方法,我们需要手写大量的额外代码,不然容易出现各种异常。

    现在有个好消息是:org.apache.commons.lang3包下的StringUtils工具类,给我们提供了非常丰富的选择。

    6.1字符串判空

    其实空字符串,不只是 null 一种,还有""," ","null"等等,多种情况。

    StringUtils 给我们提供了多个判空的静态方法,例如:

    1. String str1 = null;
    2. String str2 = "";
    3. String str3 = " ";
    4. String str4 = "abc";
    5. System.out.println(StringUtils.isEmpty(str1));
    6. System.out.println(StringUtils.isEmpty(str2));
    7. System.out.println(StringUtils.isEmpty(str3));
    8. System.out.println(StringUtils.isEmpty(str4));
    9. System.out.println("=====");
    10. System.out.println(StringUtils.isNotEmpty(str1));
    11. System.out.println(StringUtils.isNotEmpty(str2));
    12. System.out.println(StringUtils.isNotEmpty(str3));
    13. System.out.println(StringUtils.isNotEmpty(str4));
    14. System.out.println("=====");
    15. System.out.println(StringUtils.isBlank(str1));
    16. System.out.println(StringUtils.isBlank(str2));
    17. System.out.println(StringUtils.isBlank(str3));
    18. System.out.println(StringUtils.isBlank(str4));
    19. System.out.println("=====");
    20. System.out.println(StringUtils.isNotBlank(str1));
    21. System.out.println(StringUtils.isNotBlank(str2));
    22. System.out.println(StringUtils.isNotBlank(str3));
    23. System.out.println(StringUtils.isNotBlank(str4));

    执行结果:

    1. true
    2. true
    3. false
    4. false
    5. =====
    6. false
    7. false
    8. true
    9. true
    10. =====
    11. true
    12. true
    13. true
    14. false
    15. =====
    16. false
    17. false
    18. false
    19. true

    示例中的:isEmptyisNotEmptyisBlankisNotBlank,这 4 个判空方法,大家可以根据实际情况使用。

    优先推荐使用isBlankisNotBlank方法,因为它会把" "也考虑进去。

    6.2分隔字符串

    分隔字符串是常见需求,如果直接使用 String 类的 split 方法,就可能会出现空指针异常。

    1. String str1 = null;
    2. System.out.println(StringUtils.split(str1,","));
    3. System.out.println(str1.split(","));

    执行结果:

    1. null
    2. Exception in thread "main" java.lang.NullPointerException
    3. at com.sue.jump.service.test1.UtilTest.main(UtilTest.java:21)

    使用 StringUtils 的 split 方法会返回 null,而使用 String 的 split 方法会报指针异常。

    6.3判断是否纯数字

    给定一个字符串,判断它是否为纯数字,可以使用isNumeric方法。例如:

    1. String str1 = "123";
    2. String str2 = "123q";
    3. String str3 = "0.33";
    4. System.out.println(StringUtils.isNumeric(str1));
    5. System.out.println(StringUtils.isNumeric(str2));
    6. System.out.println(StringUtils.isNumeric(str3));

    执行结果:

    1. true
    2. false
    3. false

    6.4将集合拼接成字符串

    有时候,我们需要将某个集合的内容,拼接成一个字符串,然后输出,这时可以使用join方法。例如: 

    1. List<String> list = Lists.newArrayList("a", "b", "c");
    2. List<Integer> list2 = Lists.newArrayList(1, 2, 3);
    3. System.out.println(StringUtils.join(list, ","));
    4. System.out.println(StringUtils.join(list2, " "));

    执行结果:

    1. a,b,c
    2. 1 2 3

    当然还有很多实用的方法,这里就不一一介绍了。

     

    7.Assert

    很多时候,我们需要在代码中做判断:如果不满足条件,则抛异常。

    有没有统一的封装呢?

    其实spring给我们提供了Assert类,它表示断言

    7.1断言参数是否为空

    断言参数是否空,如果不满足条件,则直接抛异常。

    1. String str = null;
    2. Assert.isNull(str, "str必须为空");
    3. Assert.isNull(str, () -> "str必须为空");
    4. Assert.notNull(str, "str不能为空");

    如果不满足条件就会抛出IllegalArgumentException异常。

     8.IOUtils

    IO流在我们日常工作中也用得比较多,尽管 Java 已经给我们提供了丰富的 API。

    但我们不得不每次读取文件,或者写入文件之后,写一些重复的代码。手动在finally代码块中关闭流,不然可能会造成内存溢出

    有个好消息是:如果你使用org.apache.commons.io包下的IOUtils类,会节省大量的时间。

     8.1读取文件

    如果你想将某个 txt 文件中的数据,读取到字符串当中,可以使用 IOUtils 类的toString方法。例如:

    1. String str = IOUtils.toString(new FileInputStream("/temp/a.txt"), StandardCharsets.UTF_8);
    2. System.out.println(str);

     8.2写入文件

    如果你想将某个字符串的内容,写入到指定文件当中,可以使用 IOUtils 类的write方法。例如:

    1. String str = "abcde";
    2. IOUtils.write(str, new FileOutputStream("/temp/b.tx"), StandardCharsets.UTF_8);

    8.3文件拷贝

    如果你想将某个文件中的所有内容,都拷贝到另一个文件当中,可以使用 IOUtils 类的copy方法。例如:

    IOUtils.copy(new FileInputStream("/temp/a.txt"), new FileOutputStream("/temp/b.txt"));

    8.4读取文件内容到字节数组

    如果你想将某个文件中的内容,读取字节数组中,可以使用 IOUtils 类的toByteArray方法。例如:

    byte[] bytes = IOUtils.toByteArray(new FileInputStream("/temp/a.txt"));

    IOUtils 类非常实用,感兴趣的小伙们,可以看看下面内容。

    9.MDC

    MDCorg.slf4j包下的一个类,它的全称是 Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。

    MDC 的底层是用了ThreadLocal来保存数据的。

    我们可以用它传递参数。

    例如现在有这样一种场景:我们使用RestTemplate调用远程接口时,有时需要在header中传递信息,比如:traceId,source 等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。

    这种业务场景就能通过ClientHttpRequestInterceptor接口实现,具体做法如下:

    第一步,定义一个 LogFilter 拦截所有接口请求,在 MDC 中设置 traceId:

    1. public class LogFilter implements Filter {
    2. @Override
    3. public void init(FilterConfig filterConfig) throws ServletException {
    4. }
    5. @Override
    6. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    7. MdcUtil.add(UUID.randomUUID().toString());
    8. System.out.println("记录请求日志");
    9. chain.doFilter(request, response);
    10. System.out.println("记录响应日志");
    11. }
    12. @Override
    13. public void destroy() {
    14. }
    15. }

    第二步,实现ClientHttpRequestInterceptor接口,MDC 中获取当前请求的 traceId,然后设置到 header 中:

    1. public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
    2. @Override
    3. public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    4. request.getHeaders().set("traceId", MdcUtil.get());
    5. return execution.execute(request, body);
    6. }
    7. }

    第三步,定义配置类,配置上面定义的RestTemplateInterceptor类:

    1. @Configuration
    2. public class RestTemplateConfiguration {
    3. @Bean
    4. public RestTemplate restTemplate() {
    5. RestTemplate restTemplate = new RestTemplate();
    6. restTemplate.setInterceptors(Collections.singletonList(restTemplateInterceptor()));
    7. return restTemplate;
    8. }
    9. @Bean
    10. public RestTemplateInterceptor restTemplateInterceptor() {
    11. return new RestTemplateInterceptor();
    12. }
    13. }

     其中 MdcUtil 其实是利用 MDC 工具在 ThreadLocal 中存储和获取 traceId。

    1. public class MdcUtil {
    2. private static final String TRACE_ID = "TRACE_ID";
    3. public static String get() {
    4. return MDC.get(TRACE_ID);
    5. }
    6. public static void add(String value) {
    7. MDC.put(TRACE_ID, value);
    8. }
    9. }

    当然,这个例子中没有演示 MdcUtil 类的 add 方法具体调的地方,我们可以在 filter 中执行接口方法之前,生成 traceId,调用 MdcUtil 类的 add 方法添加到 MDC 中,然后在同一个请求的其他地方就能通过 MdcUtil 类的 get 方法获取到该 traceId。

    能使用 MDC 保存 traceId 等参数的根本原因是,用户请求到应用服务器,Tomcat 会从线程池中分配一个线程去处理该请求。

    该请求的整个过程中,保存到 MDC 的 ThreadLocal 中的参数,也是该线程独享的,所以不会有线程安全问题。

    10.ClassUtils

    spring 的org.springframework.util包下的ClassUtils类,它里面有很多让我们惊喜的功能。

    它里面包含了类和对象相关的很多非常实用的方法。

    10.1获取对象的所有接口

     如果你想获取某个对象的所有接口,可以使用 ClassUtils 的getAllInterfaces方法。例如:

    Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(new User());

    10.2获取某个类的包名

    如果你想获取某个类的包名,可以使用 ClassUtils 的getPackageName方法。例如:

    1. String packageName = ClassUtils.getPackageName(User.class);
    2. System.out.println(packageName);

    10.3判断某个类是否内部类

     如果你想判断某个类是否内部类,可以使用 ClassUtils 的isInnerClass方法。例如

    System.out.println(ClassUtils.isInnerClass(User.class));

    10.4判断对象是否代理对象

     如果你想判断对象是否代理对象,可以使用 ClassUtils 的isCglibProxy方法。例如:

    System.out.println(ClassUtils.isCglibProxy(new User()));

    ClassUtils 还有很多有用的方法,感兴趣的朋友,可以看看下面内容。

    11.BeanUtils

    spring 给我们提供了一个JavaBean的工具类,它在org.springframework.beans包下面,它的名字叫做:BeanUtils

    让我们一起看看这个工具可以带给我们哪些惊喜。

    11.1拷贝对象的属性

    曾几何时,你有没有这样的需求:把某个对象中的所有属性,都拷贝到另外一个对象中。这时就能使用 BeanUtils 的copyProperties方法。例如:

    1. User user1 = new User();
    2. user1.setId(1L);
    3. user1.setName("苏三");
    4. user1.setAddress("成都");
    5. User user2 = new User();
    6. BeanUtils.copyProperties(user1, user2);
    7. System.out.println(user2);

    11.2实例化某个类

     如果你想通过反射实例化一个类的对象,可以使用 BeanUtils 的instantiateClass方法。例如:

    1. User user = BeanUtils.instantiateClass(User.class);
    2. System.out.println(user);

    11.3获取指定类的指定方法

     如果你想获取某个类的指定方法,可以使用 BeanUtils 的findDeclaredMethod方法。例如:

    1. Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
    2. System.out.println(declaredMethod.getName());

    11.4获取指定方法的参数

     如果你想获取某个方法的参数,可以使用 BeanUtils 的findPropertyForMethod方法。例如:

    1. Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
    2. PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
    3. System.out.println(propertyForMethod.getName());

    如果你对 BeanUtils 比较感兴趣,可以看看下面内容。

    12.ReflectionUtils 

    有时候,我们需要在项目中使用反射功能,如果使用最原始的方法来开发,代码量会非常多,而且很麻烦,它需要处理一大堆异常以及访问权限等问题。

    好消息是 spring 给我们提供了一个ReflectionUtils工具,它在org.springframework.util包下面。

    12.1获取方法

    如果你想获取某个类的某个方法,可以使用 ReflectionUtils 类的findMethod方法。例如:

    Method method = ReflectionUtils.findMethod(User.class, "getId");

    12.2获取字段

    如果你想获取某个类的某个字段,可以使用 ReflectionUtils 类的findField方法。例如: 

    Field field = ReflectionUtils.findField(User.class, "id");

    12.3执行方法

    如果你想通过反射调用某个方法,传递参数,可以使用 ReflectionUtils 类的invokeMethod方法。例如:

    ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);

    12.4判断字段是否常量

    如果你想判断某个字段是否常量,可以使用 ReflectionUtils 类的isPublicStaticFinal方法。例如:

    1. Field field = ReflectionUtils.findField(User.class, "id");
    2. System.out.println(ReflectionUtils.isPublicStaticFinal(field));

    12.5判断是否 equals 方法

    如果你想判断某个方法是否 equals 方法,可以使用 ReflectionUtils 类的isEqualsMethod方法。例如:

    1. Method method = ReflectionUtils.findMethod(User.class, "getId");
    2. System.out.println(ReflectionUtils.isEqualsMethod(method));

    当然这个类还有不少有趣的方法,感兴趣的朋友,可以看看下面内容。

    13.Base64Utils

    有时候,为了安全考虑,需要将参数只用base64编码。

    这时就能直接使用org.springframework.util包下的Base64Utils工具类。

    它里面包含:encodedecode方法,用于对数据进行加密和解密。例如:

    1. String str = "abc";
    2. String encode = new String(Base64Utils.encode(str.getBytes()));
    3. System.out.println("加密后:" + encode);
    4. try {
    5. String decode = new String(Base64Utils.decode(encode.getBytes()), "utf8");
    6. System.out.println("解密后:" + decode);
    7. } catch (UnsupportedEncodingException e) {
    8. e.printStackTrace();
    9. }

    执行结果:

    1. 加密后:YWJj
    2. 解密后:abc

    14.StandardCharsets

    我们在做字符转换的时候,经常需要指定字符编码,比如:UTF-8、ISO-8859-1 等等。

    这时就可以直接使用java.nio.charset包下的StandardCharsets类中静态变量。

    例如:

    1. String str = "abc";
    2. String encode = new String(Base64Utils.encode(str.getBytes()));
    3. System.out.println("加密后:" + encode);
    4. String decode = new String(Base64Utils.decode(encode.getBytes())
    5. , StandardCharsets.UTF_8);
    6. System.out.println("解密后:" + decode);

    15.DigestUtils

    有时候,我们需要对数据进行加密处理,比如:md5 或 sha256。

    可以使用 apache 的org.apache.commons.codec.digest包下的DigestUtils类。

    15.1md5加密

    如果你想对数据进行 md5 加密,可以使用 DigestUtils 的md5Hex方法。例如:

    1. String md5Hex = DigestUtils.md5Hex("轮子");
    2. System.out.println(md5Hex);

    15.2sha256 加密

     如果你想对数据进行 sha256 加密,可以使用 DigestUtils 的sha256Hex方法。例如:

    1. String md5Hex = DigestUtils.sha256Hex("轮子");
    2. System.out.println(md5Hex);

    当然这个工具还有很多其他的加密方法。

    16.SerializationUtils

    有时候,我们需要把数据进行序列化反序列化处理。

    传统的做法是某个类实现Serializable接口,然后用它的writeObjectreadObject方法。

    但如果使用org.springframework.util包下的SerializationUtils工具类,能更轻松实现序列化和反序列化功能。例如:

    1. Map<String, String> map = Maps.newHashMap();
    2. map.put("a", "1");
    3. map.put("b", "2");
    4. map.put("c", "3");
    5. byte[] serialize = SerializationUtils.serialize(map);
    6. Object deserialize = SerializationUtils.deserialize(serialize);
    7. System.out.println(deserialize);

    17.HttpStatus

    很多时候,我们会在代码中定义 http 的返回码,比如:接口正常返回 200,异常返回 500,接口找不到返回 404,接口不可用返回 502 等。

    1. private int SUCCESS_CODE = 200;
    2. private int ERROR_CODE = 500;
    3. private int NOT_FOUND_CODE = 404;

    其实org.springframework.http包下的 HttpStatus 枚举,或者org.apache.http包下的HttpStatus接口,已经把常用的 http 返回码给我们定义好了,直接拿来用就可以了,真的不用再重复定义了。

     

     

  • 相关阅读:
    GRS认证里 “收货人问题” 的最新解读
    &3 在浏览器中查看请求报文和响应报文
    AIGC 时代,Amazon DeepRacer 带你驶入机器学习的快车道
    网页基本信息和标签
    【C++基础】13. 结构体
    【夜读】从四个处世细节,看一个人是否靠谱
    面试官:线程池中多余的线程是如何回收的?
    PUBG官方:聊聊外挂、封号、误封、白名单等问题
    java读取word里面的表格数据
    【1302. 层数最深叶子节点的和】
  • 原文地址:https://blog.csdn.net/qq_26420601/article/details/125403370