某个类的方法代码如下(为节省空间,我在这贴的省略了异常处理)
public Showable getInstance(String key,Object...args) {
p.loadFromXML(new FileInputStream("properties.xml"));
Class<Showable> c =(Class<Showable>) Class.forName(p.getProperty(key));
Class[] toa= new Class[args.length];
for(int i=0;i<args.length;i++)
{
toa[i]=args[i].getClass();
}
Constructor<Showable> show =  c.getConstructor(args.getClass());
return show.newInstance(args);
}
我要从一个XML配置文件里,通过某一个兼职,取出某个类的全路径,用这个全路径去实例化一个对象,但构造函数是不唯一的,所有我使用了可变参数,但麻烦来了,倒数第二句,是根据这可变参数里每一个参数的Class对象作为参数,取出我要调用的相应构造方法,如何实现呢?
我试过以下方法:
1,如代码所示,直接填args.getClass,结果不行
2,用数组toa作为参数,结果也不行
我该怎么办啊

解决方案 »

  1.   

    Showable或其子类的构造方法纠长什么样,贴出方法签名来
      

  2.   

    比如说我的构造方法有两个
    Person(String ,int)
    Worker(String,int ,String)
    worker继承自Person
      

  3.   

    Showable仅仅是个接口,实现类就是Person,worker继承自person,之后可能还会扩展
      

  4.   

    那就必须与构造方法的参数类型一致了
    Person(String ,int)就要是String.class和int.class
    Worker(String,int ,String)就要是String.class,int.class和String.class如果这些类只有一个多参的构造方法或者有多个多参的构造方法但你可以区别,可以尝试Class#getConstructors()
      

  5.   

    谢谢,我最后想到的办法也是遍历Constructors[] 然后把args作为参数去try实例化,成功的话就返回对象,不过这样貌似效率有点问题,毕竟构造器多了时间复杂度是n,多线程就变m*n了,我读了getConstructor()的源代码,它的内部实现实际上就是getConstructor0(Object[],int),我不知道为什么我就像你提示的传Object[].class却不能拿到准确的那个构造器,看来java还是不够智能啊,呵呵,我再等等看,有没有大牛给更好的解决方法?感激不尽
      

  6.   

    这还真不能怪java
    首先java类库可以做到,但是如果假设有
    Person(String,Integer)
    Person(String,int)
    该找哪个好?这就涉及一个查找顺序的问题了,会给编程人员带来困惑以及一些微妙的错误