
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]
确保每个对象都能正确地被创建,并显示出预期的属性值。
总结
通过反射,我们可以在运行时动态地创建目标类的对象,并根据不同的构造函数初始化对象属性。在编写反射代码时,记得处理常见异常,如ClassNotFoundException
和InstantiationException
,并确保传递给构造函数的参数类型和数量与目标构造函数匹配。这样,无论目标类的定义如何变化,我们都可以灵活地通过反射创建对象。
发表评论
最新留言
初次前来,多多关照!
[***.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
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
2023-01-24
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了
2023-01-24
10个程序员可以接私活的平台
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