我现在知道一个类名,例如xxx。我可以用Class.forName("xxx").newInstance();得到该类的一个对象的实例。可是我现在想创建一个对象的一维数组,数组大小固定。不知道可不可以实现。

解决方案 »

  1.   

    xxx [] xxxArray = new xxx[num];
    xxxArray[0] = (xxx)Class.forName("xxx").newInstance();
    .............
      

  2.   

    it's so easy!
    java.lang.reflect.Array.newInstance(Class type,int length);
    java.lang.reflect.Array.newInstance(Class type,int[] dimensions);
      

  3.   

    xxx是一个字符串。
    现在是这样的,因为我要用的是invoke()方法,所以必须是精确类型的。
    Array.newInstance或者ArrayList.toArray都能得到,但是类型都是Object[]或者Object类型。不知道能不能得到精确类型。是不是实现不了啊?我对java属于刚刚入门,请各位高手指点。
      

  4.   

    具体代码是这样的:
    for{
    Object objdata = Class.forName("xxx").newInstance();
    aryData.add(j,objdata);
    }Object[] obj = {};
    obj = (Object[])aryData.toArray(obj);Object[] vals = {obj};
    meth.invoke(form, vals);invoke行:
    [05/10/31 10:44:56:505 CST]  eae762b SystemOut     O Exception:argument type mismatch如果写成这样:
    for{
    Object objdata = Class.forName("xxx").newInstance();
    aryData.add(j,objdata);
    }xxx[] obj = {};
    obj = (xxx[])aryData.toArray(obj);Object[] vals = {obj};
    meth.invoke(form, vals);运行通过,可是现在由于xxx是运行的时候才知道的类型,现在不能这么写。不知道怎么写才能实现。
      

  5.   

    where is the form defined?
      

  6.   

    Form是外面传进来的一个对象,里面这么定义的:
    private xxx[] xxxlist = null;
    public void setxxxList(xxx[] list){
    xxxlist = list;
    }
    上面代码中的meth.invoke(form, vals);就是set方法。
      

  7.   

    呵呵,请treeroot(旗鲁特) 给出代码,我们支持你
      

  8.   

    treeroot(旗鲁特):在我这里实现不不了,能帮忙分析一下吗?谢谢。
      

  9.   

    package testInvoke;import java.io.IOException;
    import java.lang.reflect.Method;
    import java.sql.SQLException;
    import java.util.ArrayList;public class testInvoke { public static void main (String[] argv) throws IOException, SQLException {
    Form2 form = new Form2();

    try{
    invoke(form);
    }catch (Exception e){
    e.printStackTrace();
    }
    } public static void  invoke(Form2 form)throws Exception{
    String formName =("" + form.getClass()).substring(("class ").length());

    Class mainFormClass = Class.forName(formName);
    Method[] mainFormMethod = mainFormClass.getMethods();
    Method meth = null;
    String strCName = null;
    for(int i = 0 ; i<mainFormMethod.length; i++ ){
    System.out.println("mainFormMethod[i].getName[" + i + "]:" + mainFormMethod[i].getName());
    if(mainFormMethod[i].getName().equals("setForm")){
    String name = "" + mainFormMethod[i];
    System.out.println("name:" + name);
    meth = mainFormMethod[i];
    strCName = name.substring(name.indexOf("(") + 1,name.indexOf("[]"));
    System.out.println("strCName:" + strCName);
    break;
    }
    }

    ArrayList ary = new ArrayList();
    for(int i = 0 ; i < 2 ; i ++){
    Class subFormClass = Class.forName(strCName);
    Object subForm = Class.forName(strCName).newInstance();
    Class[] type = {String.class};
    Method subFormMethod = subFormClass.getMethod("setA",type);

    Object[] val = {"vvv"};
    subFormMethod.invoke(subForm,val);

    ary.add(i,subForm);
    }

    Object[] obj = {};
    obj = (Object[])ary.toArray(obj);
    System.out.println("obj");
    Object[] a =  {obj};
    meth.invoke(form,a);
    System.out.println("meth.invoke(form,obj);--------");
    }
    }

    package testInvoke;public  class Form1{
    public Form1(){

    }
    private String a = null; public final String getA() {
    return a;
    } public final void setA(String a) {
    this.a = a;
    }
    }package testInvoke;public  class Form2{
    private Form1[] form = null; public final Form1[] getForm() {
    return form;
    } public final void setForm(Form1 form[]) {
    this.form = form;
    }

    public Form2(){

    }}程序比较复杂,简单摘了些出来。代码比较简单,就没有加注释。
      

  10.   

    稍微修改了一下,那调用反射方法的时候类型不匹配package test;import java.io.IOException;
    import java.lang.reflect.Array;
    import java.lang.reflect.Method;
    import java.sql.SQLException;
    import java.util.ArrayList;public class TestInvoke { public static void main(String[] argv) throws IOException, SQLException {
    Form2 form = new Form2();

    try {
    invoke(form);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public static void invoke(Form2 form) throws Exception {
    //String formName = ("" + form.getClass()).substring(("class ").length()); //Class mainFormClass = Class.forName(formName);

    Class mainFormClass=form.getClass(); //北京到天津 还要绕过上海?


    Method[] mainFormMethod = mainFormClass.getMethods();
    Method meth = null;
    String strCName = null;
    for (int i = 0; i < mainFormMethod.length; i++) {
    System.out.println("mainFormMethod[i].getName[" + i + "]:"
    + mainFormMethod[i].getName());
    if (mainFormMethod[i].getName().equals("setForm")) {
    String name = "" + mainFormMethod[i];
    //System.out.println("name:" + name);
    meth = mainFormMethod[i];
    //strCName = name.substring(name.indexOf("(") + 1, name
    // .indexOf("[]"));
    //System.out.println("strCName:" + strCName);
    break;
    }
    }
    ArrayList ary = new ArrayList();
    Class subFormClass=meth.getParameterTypes()[0].getComponentType();
    System.out.println(meth.getName());
    for (int i = 0; i < 2; i++) {
    //Class subFormClass = Class.forName(strCName);

    //Object subForm = Class.forName(strCName).newInstance();
    Object subForm = subFormClass.newInstance();
    Class[] type = { String.class };
    Method subFormMethod = subFormClass.getMethod("setA", type); Object[] val = { "vvv" };
    subFormMethod.invoke(subForm, val); ary.add(i, subForm);
    } Object[] obj = (Object[]) Array.newInstance(subFormClass, ary.size());//{};
    obj = (Object[]) ary.toArray(obj); System.out.println("obj");
    Object[] a = { obj };
    meth.invoke(form, a);
    System.out.println("meth.invoke(form,obj);--------");
    }
    }class Form1 { public Form1() { } private String a = null; public final String getA() {
    return a;
    } public final void setA(String a) {
    this.a = a;
    }
    }class Form2 {
    private Form1[] form = null; public final Form1[] getForm() {
    return form;
    } public final void setForm(Form1 form[]) {
    this.form = form;
    } public Form2() { }}
      

  11.   

    String formName =("" + form.getClass()).substring(("class ").length());

    Class mainFormClass = Class.forName(formName);看到这两句实在让人哭笑不得!
    getClass()你已经用到了,不知道为什么要.....
    而且你用Class.forName还要处理异常!和这个差不多
    int i=10;
    int j=Integer.parseInt(String.valueOf(i));
    是不是觉得代码多的爽呀,或者觉得让CPU闲着不爽呀
      

  12.   

    多谢指教,我的编程习惯确实有问题。第一个地方是确实不知道,第二个地方是没注意。
    程序通过了,问题应该可以解决了。可是两行代码还请大侠给解释一下:
    Object[] obj = {};
    obj = (Object[]) ary.toArray(obj);Object[] obj = (Object[]) Array.newInstance(subFormClass, ary.size());//{};
    obj = (Object[]) ary.toArray(obj);
    在有明确的对象类型时,我以前都是按照上面的用的,所以这次也就习惯性的写上了。我不知道两个有什么区别。ary.toArray怎么执行?
      

  13.   

    List.toArray() //得到的Object[], arr.getClass().getComponentType() ==Object.class
    List.toArray(Object[] objs)//得到的类型和传入的参数类型一样Object[] obj={} 是一个空的Object数组,和 Object[] obj=new Object[0]一样
    如果你事先知道类型是Form2
    Object[] obj=new Form2[0] 是可以的
    如果不知道的,只有通过反射了,当然数组大小不会影响类型
     Object[] obj = (Object[]) Array.newInstance(subFormClass, 0); //改为0也是可以的
    obj = (Object[]) ary.toArray(obj);
      

  14.   

    obj = (Object[]) ary.toArray(obj);
    我一直以为得到类型和(Object[]) 一致呢,原来是和传入的obj一致啊。
    多谢了。看来以后还要多看看书才行啊。
    学习java从今天开始