为了账号安全,请及时绑定邮箱和手机立即绑定

希望自定义一个函数,传入类.class与可变参数,返回通过反射调用对应构造函数构造出的类

希望自定义一个函数,传入类.class与可变参数,返回通过反射调用对应构造函数构造出的类

慕的地6264312 2023-04-09 10:06:08
注意:int.class不等于Integer.class 问题:因此此处调用Person p = createPerson(Person.class,3,"nilu");会找不到对应构造函数,因为它找的是传入Integer与String的构造函数,如何解决?//junit测试函数@Testpublic void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {Person p = createPerson(Person.class,3,"nilu");p.eat();}public <T> T createPerson(Class<T> clazz, Object ...args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {final List<Class> list = new ArrayList<Class>();for(Object obj : args) {list.add(obj.getClass());}Class []_args = new Class[args.length];list.toArray(_args);list.clear();Constructor<T> constructor = clazz.getConstructor(_args);T t = constructor.newInstance(args);return t;}类:public class Person {private String name;private int age;public Person() {this.age = 18;this.name = "default name";System.out.println("Person constructor");}public Person(String name) {this.name = name;System.out.println("Person name : " + name);}public Person(int age, String name) {this.age = age;this.name = name;System.out.println("Person name : " + name);System.out.println("Person age : " + age);}}=======================================================================问题描述补充:Constructor<T> constructor = clazz.getConstructor(_args);这一行 根据_args是哪些.class 会决定得到哪个构造函数,这里实际得到的是Integer.class与String.class;然而Person(int age, String name)实际要的是int.class与String.class;这是由于调用createPerson时候,3这个int被自动装箱了,变成了Integer,因此程序会报错提示味找到构造函数createPerson(Integer,String)
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

循环取参数class的时候判断一下是否基本类型,如果是就先转成基本类型的class。或者判断下这个类是否有个TYPE常量:


Class cls = obj.getClass();Field f = cls.getDeclaredField("TYPE");if (f != null) {    list.add((Class) f.get(null));else {    list.add(cls);}


查看完整回答
反对 回复 2023-04-11
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

参数类型不一致,自动装箱,自动拆箱先不要考虑试试。


查看完整回答
反对 回复 2023-04-11
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信