java - 创建编译时未知的类的实例

标签 java design-patterns inheritance reflection

我有一个抽象类:

public abstract class Room {

}

以及编译时未知的继承类,例如:

public class MagicRoom extends Room {

    public MagicRoom(){
        System.out.println("Creating a MagicRoom.");
    }

    public String magic = "";
}

或者:

public class Dungeon extends Room {

    public Dungeon(){
        System.out.println("Creating a Dungeon");
    }

    public String keeper = "";
}

我有一个类,我将从中创建这些类的实例:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class MazeGame {

    public static Room makeRoom(Class roomClass) 
        throws IllegalArgumentException, InstantiationException, 
            IllegalAccessException, InvocationTargetException, 
            SecurityException, NoSuchMethodException{

        Constructor c = roomClass.getConstructor();
        return c.newInstance();

    }

}
makeRoom 是我尝试创建一个从 Room 继承的类,该类在编译时我不知道其类型,但我不确定将什么作为其返回类型而不是 Room。因为 makeRoom 返回一个 Room,所以如果我尝试使用属于继承类的字段,则会出现异常:

import java.lang.reflect.InvocationTargetException;

public class FactoryTest {

    public static void main(String[] args) 
        throws IllegalArgumentException, SecurityException, 
            InstantiationException, IllegalAccessException, 
            InvocationTargetException, NoSuchMethodException{

        MazeGame game = new MazeGame();

        Room magicRoom = MazeGame.makeRoom(MagicRoom.class);

        /*
         * Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
         * magic cannot be resolved or is not a field
         */

        magicRoom.magic = "a"; 

    }
}

最佳答案

使该方法通用:

public static <T extends Room> T makeRoom(Class<T> roomClass) 
    throws IllegalArgumentException, InstantiationException, 
        IllegalAccessException, InvocationTargetException, 
        SecurityException, NoSuchMethodException{

    // This is enough, if you have 0-arg constructor in all your subclasses
    return roomClass.newInstance();
}

然后像这样调用它:

MagicRoom magicRoom = MazeGame.makeRoom(MagicRoom.class);  

关于java - 创建编译时未知的类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21632979/

相关文章:

AngularJS +1.5 父 Controller 如何将数据传递给组件 Controller

java - 如何忽略要单击的元素,尽管不可见 Selenium

java - 解决 io.netty :netty-transport-native-epoll 时 Jenkins 中的 Maven 出错

java - 创建索引请求映射在 Elasticsearch 中失败

.net - 最终阻止的目的是什么?

inheritance - 我在这个 UML 类图中找不到错误

java - 生产环境中的 Tomcat

design-patterns - 快速程序接口(interface)

design-patterns - 如何创建函数集合?

c++ - 直接type cast derived到基类调用重载函数