首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【commons-beanutils专题】002- ConstructorUtils 专题

【commons-beanutils专题】002- ConstructorUtils 专题

作者头像
訾博ZiBo
发布2025-01-06 14:44:05
发布2025-01-06 14:44:05
8100
代码可运行
举报
运行总次数:0
代码可运行

【commons-beanutils专题】002- ConstructorUtils 专题

一、准备

0、ConstructorUtils 主要作用

主要用于通过反射技术操作对象的构造方法:执行构造方法、获得指定构造方法等;

普通和精确的区别:普通的会找到兼容类型的方法,精确的只会匹配到确切的参数类型的方法。

1、引入 commons-beanutils 依赖

代码语言:javascript
代码运行次数:0
运行
复制
<!--引入依赖commons-beanutils-->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

2、pom.xml 文件

代码语言:javascript
代码运行次数:0
运行
复制
<?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、实体类

代码语言:javascript
代码运行次数:0
运行
复制
package com.zibo.zibo2022.constructor_utils.entity;

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

/**
 * @author zibo
 * @date 2022/7/13 0013 18:29
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    /**
     * 名字
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 地址
     */
    private String address;

    /**
     * 单参数构造方法
     * @param name 名字
     */
    public Student(String name) {
        this.name = name;
    }

    /**
     * 多参数构造方法
     * @param name 名字
     * @param age 年龄
     */
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 单参数构造方法
     * @param age 年龄
     */
    public Student(Integer age) {
        this.age = age;
    }

}

二、执行构造方法

1、执行构造方法 - 单个参数 - 自动获取类型

代码语言:javascript
代码运行次数:0
运行
复制
// 1、执行构造方法 - 单个参数 - 自动获取类型
try {
    Student student1 = ConstructorUtils.invokeConstructor(Student.class, "张三");
    System.out.println(student1.getName()); // 张三
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

2、执行构造方法 - 多个参数 - 自动获取类型

代码语言:javascript
代码运行次数:0
运行
复制
// 2、执行构造方法 - 多个参数 - 自动获取类型
try {
    // 参数列表
    Object[] args1 = new Object[] {"李四", 18};
    Student student2 = ConstructorUtils.invokeConstructor(Student.class, args1);
    System.out.println(student2.getName()); // 李四
    System.out.println(student2.getAge()); // 18
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

3、执行构造方法 - 多个参数 - 手动设置类型

代码语言:javascript
代码运行次数:0
运行
复制
// 3、执行构造方法 - 多个参数 - 手动设置类型
try {
    // 参数列表
    Object[] args1 = new Object[] {"王五", 20};
    // 参数类型列表
    Class<?>[] types = new Class[] {String.class, Integer.class};
    Student student3 = ConstructorUtils.invokeConstructor(Student.class, args1, types);
    System.out.println(student3.getName()); // 王五
    System.out.println(student3.getAge()); // 20
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

三、执行精确的构造方法

1、执行精确的构造方法 - 单个参数 - 自动获取类型

代码语言:javascript
代码运行次数:0
运行
复制
// 4、执行精确的构造方法 - 单个参数 - 自动获取类型
try {
    Student student4 = ConstructorUtils.invokeExactConstructor(Student.class, "张三");
    System.out.println(student4.getName()); // 张三
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

2、执行精确的构造方法 - 多个参数 - 自动获取类型

代码语言:javascript
代码运行次数:0
运行
复制
// 5、执行精确的构造方法 - 多个参数 - 自动获取类型
try {
    // 参数列表
    Object[] args1 = new Object[] {"李四", 18};
    Student student5 = ConstructorUtils.invokeExactConstructor(Student.class, args1);
    System.out.println(student5.getName()); // 李四
    System.out.println(student5.getAge()); // 18
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

3、执行精确的构造方法 - 多个参数 - 手动设置类型

代码语言:javascript
代码运行次数:0
运行
复制
// 6、执行精确的构造方法 - 多个参数 - 手动设置类型
try {
    // 参数列表
    Object[] args1 = new Object[] {"王五", 20};
    // 参数类型列表
    Class<?>[] types = new Class[] {String.class, Integer.class};
    Student student6 = ConstructorUtils.invokeExactConstructor(Student.class, args1, types);
    System.out.println(student6.getName()); // 王五
    System.out.println(student6.getAge()); // 20
} catch (NoSuchMethodException | IllegalAccessException |
         InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

四、指定类型,获取构造方法

1、指定一个类型,获取单参构造方法(测试1)

代码语言:javascript
代码运行次数:0
运行
复制
// 7、指定一个类型,获取单参构造方法(测试1)
try {
    Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, String.class);
    Student student7 = constructor.newInstance("马六");
    System.out.println(student7.getName()); // 马六
} catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

2、指定一个类型,获取单参构造方法(测试2)

代码语言:javascript
代码运行次数:0
运行
复制
// 8、指定一个类型,获取单参构造方法(测试2)
try {
    Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, Integer.class);
    Student student8 = constructor.newInstance(26);
    System.out.println(student8.getAge()); // 26
} catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

3、指定一个类型列表,获取多参构造方法

代码语言:javascript
代码运行次数:0
运行
复制
// 9、指定一个类型列表,获取多参构造方法
try {
    // 参数类型列表
    Class<?>[] types = new Class[] {String.class, Integer.class};
    Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, types);
    Student student9 = constructor.newInstance("马六", 26);
    System.out.println(student9.getName()); // 马六
    System.out.println(student9.getAge()); // 26
} catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

五、获取给定构造函数的可访问版本

代码语言:javascript
代码运行次数:0
运行
复制
// 10、获取给定构造函数的可访问版本
try {
    Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, Integer.class);
    Constructor<Student> constructor1 = ConstructorUtils.getAccessibleConstructor(constructor);
    Student student10 = constructor1.newInstance(26);
    System.out.println(student10.getAge()); // 26
} catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
    throw new RuntimeException(e);
}

六、完整代码

代码语言:javascript
代码运行次数:0
运行
复制
package com.zibo.zibo2022.constructor_utils.main;

import com.zibo.zibo2022.constructor_utils.entity.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.ConstructorUtils;

/**
 * @author zibo
 * @date 2022/7/13 0013 18:31
 */
public class Main {

    public static void main(String[] args) {
        // 1、执行构造方法 - 单个参数 - 自动获取类型
        try {
            Student student1 = ConstructorUtils.invokeConstructor(Student.class, "张三");
            System.out.println(student1.getName()); // 张三
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 2、执行构造方法 - 多个参数 - 自动获取类型
        try {
            // 参数列表
            Object[] args1 = new Object[] {"李四", 18};
            Student student2 = ConstructorUtils.invokeConstructor(Student.class, args1);
            System.out.println(student2.getName()); // 李四
            System.out.println(student2.getAge()); // 18
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 3、执行构造方法 - 多个参数 - 手动设置类型
        try {
            // 参数列表
            Object[] args1 = new Object[] {"王五", 20};
            // 参数类型列表
            Class<?>[] types = new Class[] {String.class, Integer.class};
            Student student3 = ConstructorUtils.invokeConstructor(Student.class, args1, types);
            System.out.println(student3.getName()); // 王五
            System.out.println(student3.getAge()); // 20
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 4、执行精确的构造方法 - 单个参数 - 自动获取类型
        try {
            Student student4 = ConstructorUtils.invokeExactConstructor(Student.class, "张三");
            System.out.println(student4.getName()); // 张三
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 5、执行精确的构造方法 - 多个参数 - 自动获取类型
        try {
            // 参数列表
            Object[] args1 = new Object[] {"李四", 18};
            Student student5 = ConstructorUtils.invokeExactConstructor(Student.class, args1);
            System.out.println(student5.getName()); // 李四
            System.out.println(student5.getAge()); // 18
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 6、执行精确的构造方法 - 多个参数 - 手动设置类型
        try {
            // 参数列表
            Object[] args1 = new Object[] {"王五", 20};
            // 参数类型列表
            Class<?>[] types = new Class[] {String.class, Integer.class};
            Student student6 = ConstructorUtils.invokeExactConstructor(Student.class, args1, types);
            System.out.println(student6.getName()); // 王五
            System.out.println(student6.getAge()); // 20
        } catch (NoSuchMethodException | IllegalAccessException |
                 InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 7、指定一个类型,获取单参构造方法(测试1)
        try {
            Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, String.class);
            Student student7 = constructor.newInstance("马六");
            System.out.println(student7.getName()); // 马六
        } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 8、指定一个类型,获取单参构造方法(测试2)
        try {
            Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, Integer.class);
            Student student8 = constructor.newInstance(26);
            System.out.println(student8.getAge()); // 26
        } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 9、指定一个类型列表,获取多参构造方法
        try {
            // 参数类型列表
            Class<?>[] types = new Class[] {String.class, Integer.class};
            Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, types);
            Student student9 = constructor.newInstance("马六", 26);
            System.out.println(student9.getName()); // 马六
            System.out.println(student9.getAge()); // 26
        } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

        // 10、获取给定构造函数的可访问版本
        try {
            Constructor<Student> constructor = ConstructorUtils.getAccessibleConstructor(Student.class, Integer.class);
            Constructor<Student> constructor1 = ConstructorUtils.getAccessibleConstructor(constructor);
            Student student10 = constructor1.newInstance(26);
            System.out.println(student10.getAge()); // 26
        } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) {
            throw new RuntimeException(e);
        }

    }

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【commons-beanutils专题】002- ConstructorUtils 专题
  • 一、准备
    • 0、ConstructorUtils 主要作用
    • 1、引入 commons-beanutils 依赖
    • 2、pom.xml 文件
    • 3、实体类
  • 二、执行构造方法
    • 1、执行构造方法 - 单个参数 - 自动获取类型
    • 2、执行构造方法 - 多个参数 - 自动获取类型
    • 3、执行构造方法 - 多个参数 - 手动设置类型
  • 三、执行精确的构造方法
    • 1、执行精确的构造方法 - 单个参数 - 自动获取类型
    • 2、执行精确的构造方法 - 多个参数 - 自动获取类型
    • 3、执行精确的构造方法 - 多个参数 - 手动设置类型
  • 四、指定类型,获取构造方法
    • 1、指定一个类型,获取单参构造方法(测试1)
    • 2、指定一个类型,获取单参构造方法(测试2)
    • 3、指定一个类型列表,获取多参构造方法
  • 五、获取给定构造函数的可访问版本
  • 六、完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档