使用Class类创建对象

时间:2012-01-07 14:06:53

标签: java

如何使用Class类实例化对象?

我想将一个Class对象传递给一个函数,并让该函数返回我传入的类的新对象。

在我拿回物体后,我将进行施法。此外,对于此类事情的设计模式是否有任何建议?

以下是一些示例伪代码,显示了我想要做的事情:

Class Animal {
    String name;
}

Class Cat extends Animal {
    boolean hasTail;
}

主要:

Class myClass = Cat.class;
Animal createAnimal(myClass) {
    return new myClass;
}

编辑:

另外,有没有办法在返回新实例之前在我的函数中进行转换,或者我是否坚持使用默认的Object类型?

return (myClass)myClass.newInstance();

3 个答案:

答案 0 :(得分:6)

我怀疑你想要Class.newInstance()。请注意,您使用的是Cat.class,而不是Cat.getClass()

请注意newInstance()将始终尝试调用无参数构造函数 - 如果需要传递任何参数,请使用getConstructors()查找该类声明的构造函数,然后调用相应的构造函数。

答案 1 :(得分:2)

  

在我拿回物体后,我将进行施法。

     

另外,有没有办法在返回新实例之前在我的函数中进行转换,或者我是否坚持使用默认的Object类型?

如果您利用泛型,则无需进行投射。泛型以相对介绍性的细节here

进行描述

这是一个使用泛型和反射从你的伪代码派生的java示例:

public class ReflectionNewInstanceTest {

    static class Animal {
        String name;
    }

    static class Cat extends Animal { 
        boolean hasTail = true;
    }

    public static void main(String[] args) throws Exception {
        Animal a = createAnimal(Cat.class);
    }


    static <T extends Animal> T createAnimal(Class<T> clazz) throws Exception {
        return clazz.newInstance();
    }

}

对于模式,当您想抽象出对象的创建时,应该查看任何典型的创建模式。最简单的可能就是使用工厂方法。我上面的例子只是一个通用的工厂方法,并没有真正获得太多。这是一个非常简短的模式列表,你应该查找:

  • 抽象工厂模式
  • 工厂方法模式
  • 构建器模式
  • 原型模式

答案 2 :(得分:1)

您可能正在分别在Class,Constructor类中查找getConstructor()newInstance()方法。

如果您的构造函数保证没有参数,您也可以将其缩写并使用newInstance() [在Class]中

相关问题