从String创建类并使用命令模式

时间:2016-12-08 10:09:36

标签: java class

我知道这在stackoverflow之前已经受到质疑,但我无法找到解决问题的方法。 我想从ButtonClick事件中分离一些代码,我在ButtonClick上动态创建节点并将它们添加到父AnchorPane。在我的节点上是按钮,我按钮上的这些事件是用CommandPattern处理的。我创建了不同的ButtonEvents,具体取决于我创建的节点。

目前正常运作的守则是:

@FXML
void addErosionNode(ActionEvent event){
    DragNode nde = new DragNode();
    /*
    id = nde.getId();
    name = new String("Erosion");
    Erosion cmd;
    cmd = new Erosion();
    nodeList.add(new NodeList<String, String, Command>(name, id, cmd));
    */
    setupNode(nde);
    nde.setNodeWithTwoCircles();
}

但是我想把代码放在/ ** /里面另一个方法,所以我可以用setupNode(nde, name);替换代码

尝试使用此方法:

public void setupNode(DragNode nde, String name){

                id = nde.getId();
                Class clazz;
                className = new String ("application.bvfunc." + type);
                //This will be e.g. application.bvfunc.Erosion which is the class I want to use
                try {
                    clazz = Class.forName(className);
                } catch (ClassNotFoundException e) {
                    System.out.println("fail");
                }
                clazz cmd;
                cmd = new clazz();
                nodeList.add(new NodeList<String, String, Command>(name, id, cmd));

                nde.nodeLayout();
                rightAnchor.getChildren().add(nde);
                buildDragHandlers();
    }

clazz无法解析为某种类型。

如何替换

Erosion cmd;
cmd = new Erosion();

使用clazz我使用我的节点名称创建? 像这样:

clazz cmd;
cmd = new clazz();

2 个答案:

答案 0 :(得分:0)

替换

clazz cmd;
cmd = new clazz();

Command cmd = (Command) clazz.newInstance();

答案 1 :(得分:0)

您可以创建一个将其命令名称映射到构造函数的映射,而不是使用反射:

private static final Map<String, Supplier<Command>> commandMap = new HashMap<>();

static {
    commandMap.put("Erosion", Erosion::new);
    commandMap.put("Dilation", Dilation::new);
}

然后在你的其他代码中:

public void setupNode(DragNode nde, String name){
    id = nde.getId();
    Command cmd = commandMap.get(name).get(); // <-- Calls the constructor             
    nodeList.add(new NodeList<String, String, Command>(name, id, cmd));

    nde.nodeLayout();
    rightAnchor.getChildren().add(nde);
    buildDragHandlers();
}