【问题标题】:J2ME BlackBerry creating instance from array classJ2ME BlackBerry 从数组类创建实例
【发布时间】:2013-06-27 17:47:57
【问题描述】:

有没有办法使用类似的东西从Class 对象动态创建数组

MyClass[].newInstance();

我知道它会抛出一个InstantiationException,但我有办法用Class 对象实例化一个指示其类型的数组吗?

【问题讨论】:

  • 你能澄清一下吗?听起来您想要一个可以设置/更改类型的数组。我认为这是不可能的。我能想到的最接近的是Object [] array = new MyClass[10]; 您也许可以使用这个想法并创建一个将数组中的对象复制/转换为另一种类型的类。
  • 对于第一条评论:我不知道类,(我是类型类的变量)。对于第二条评论:我正在使用 J2ME。底线,是不可能的。

标签: java blackberry java-me java-micro-editon-sdk3.0


【解决方案1】:

由于 java.lang.reflect.Array.newInstance() 在 J2ME 中不可用,我认为您需要一个循环来为每个对象执行此操作:

private Object[] createArray(String fullClassName, int length) {
    Object[] objects = new Object[length];
    try {
        Class c = Class.forName(fullClassName);
        for (int i = 0; i < objects.length; i++) {
            objects[i] = c.newInstance();
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }
    return objects;
}

并记住完全限定名称(如果您使用的是字符串化的类名):

  Object[] array = createArray("mypackage.Widget", 10);

package mypackage;

public class Widget {
    public int foo() {
        return 5;
    }
}

注意getConstructor() methodBlackBerry Class 中不可用,因此您只能使用无参数构造函数创建对象。

【讨论】:

  • 使用类的字符串化名称是这里的解决方案。但只有在我使用具体类的情况下,如果数组是抽象的或接口的,则无法获取数组组件类型来实例化它们。
  • @danielrvt-sgb,如果您不想使用,则不必使用字符串名称。在我的示例中,您可以更改 createArray() 以将 Class c 作为参数。但是,某处,您需要决定创建一个具体 类。您不能实例化抽象类或接口。有些东西必须决定抽象类的哪个子类,或者创建接口的哪个实现。
  • 另外,请记得为有用的答案投票。诸如此类的问题不会引起太多关注,而投票是确定有效答案的方法。谢谢。
猜你喜欢
  • 2016-05-09
  • 2019-05-19
  • 2014-03-03
  • 2014-10-04
  • 2021-02-02
  • 1970-01-01
  • 2013-12-02
  • 2014-12-12
  • 1970-01-01
相关资源
最近更新 更多