java反射 反射构造函数 报 wrong number of arguments 错误
发布日期:2025-04-02 02:13:20 浏览次数:12 分类:精选文章

本文共 3352 字,大约阅读时间需要 11 分钟。

通过反射创建Java对象并调用其构造函数

在Java程序中,有时候我们需要通过反射机制来动态创建对象和调用其方法。这对于动态编程和扩展性设计非常有用。本文将介绍如何通过反射机制创建带有不同参数的Java对象,步骤如下:

反射创建对象的基本流程

  • 获取目标类的Class对象:使用Class.forName("com.Person")获取目标类。若找不到类,会抛ClassNotFoundException,需适当处理。

  • 获取构造函数:使用Class.getConstructors()获取所有公权的构造函数。在本例中,Person类拥有四个不同的构造函数。

    Constructor
    [] cons = demo.getConstructors();

    这里cons数组将包含四个Constructor对象,每个对象对应Person的一个构造函数。

  • 调用构造函数并创建对象

    • 对于不带参数的构造函数:
      try {    Constructor noParamCons = cons[0];    Object obj = noParamCons.newInstance();    // obj是新创建的Person对象} catch (InstantiationException | IllegalAccessException e) {    // 处理常见异常    e.printStackTrace();}
    • 对于带一个String参数的构造函数:
      try {    Constructor.StringCons = cons[1];    Object obj = StringCons.newInstance("username");    // obj是新创建的Person对象,名称已被设置} catch (InstantiationException | IllegalAccessException e) {    e.printStackTrace();}
    • 对于带一个int参数的构造函数:
      try {    Constructor.ageCons = cons[2];    Object obj = ageCons.newInstance(25);    // obj是新创建的Person对象,年龄已被设置} catch (InstantiationException | IllegalAccessException e) {    e.printStackTrace();}
    • 对于带两个参数的构造函数:
      try {    Constructor paramsCons = cons[3];    Object obj = paramsCons.newInstance(" username", 25);    // obj是新创建的Person对象,名称和年龄已被设置} catch (InstantiationException | IllegalAccessException e) {    e.printStackTrace();}
  • 处理反射异常:使用try-catch块捕获可能发生的异常,如InstantiationException(无法激发实例)、IllegalAccessException(没有足够的权限)。

  • 实现示例代码

    import java.lang.reflect.Constructor;public class Person {    private String name;    private int age;    public Person() {    }    public Person(String name) {        this.name = name;    }    public Person(int age) {        this.age = age;    }    public Person(String name, int age) {        this.age = age;        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "[" + this.name + " " + this.age + "]";    }}
    public class RefelectionExample {    public static void main(String[] args) {        // 获取目标类        Class demo = null;        try {            demo = Class.forName("com.Person");        } catch (ClassNotFoundException e) {            e.printStackTrace();            return;        }        // 获取所有公共构造函数        Constructor
    [] cons = demo.getConstructors(); try { // 创建没有参数的对象 Object obj1 = cons[0].newInstance(); System.out.println("obj1: " + obj1); // 创建带String参数的对象 Object obj2 = cons[1].newInstance("John"); System.out.println("obj2: " + obj2); // 创建带int参数的对象 Object obj3 = cons[2].newInstance(30); System.out.println("obj3: " + obj3); // 创建带两个参数的对象 Object obj4 = cons[3].newInstance("Alice", 25); System.out.println("obj4: " + obj4); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); return; } }}

    验证执行结果

    运行上述代码,预期输出:

    obj1: []obj2: [John  ]obj3: [  30]obj4: [Alice 25]

    确保每个对象都能正确地被创建,并显示出预期的属性值。

    总结

    通过反射,我们可以在运行时动态地创建目标类的对象,并根据不同的构造函数初始化对象属性。在编写反射代码时,记得处理常见异常,如ClassNotFoundExceptionInstantiationException,并确保传递给构造函数的参数类型和数量与目标构造函数匹配。这样,无论目标类的定义如何变化,我们都可以灵活地通过反射创建对象。

    上一篇:java反射介绍
    下一篇:Java反射

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月03日 07时47分48秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    ElementUI-el-progress改变进度条颜色跟文字样式 2023-01-24
    element事件(change,click)不触发 2023-01-24
    ELK原理与介绍(转) 2023-01-24
    ELK学习笔记(三)单台服务器多节点部署 2023-01-24
    ELK应用日志收集实战 2023-01-24
    elTable火狐浏览器换行 2023-01-24
    15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2023-01-24
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2023-01-24
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2023-01-24
    100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-24
    10个程序员可以接私活的平台 2023-01-24
    10个运维拿来就用的 Shell 脚本,用了才知道有多爽,零基础入门到精通,收藏这一篇就够了 2023-01-24
    10条sql语句优化的建议 2023-01-24
    10款宝藏编程工具!新手必备,大牛强烈推荐! 从零基础到精通,收藏这篇就够了! 2023-01-24
    10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了 2023-01-24
    15个Python数据分析实用技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了! 2023-01-24
    15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了! 2023-01-24
    1分钟学会在Linux下模拟网络延迟 2023-01-24