动态创建类

时间:2013-01-15 15:25:38

标签: java class

我想使用Java动态创建新类。我有3个带标签的按钮:1,2和3.代码如下:

switch (button.getActionCommand()) {
  case 1:
    return new Listener1();
    break;
  case 2:
    return new Listener2();
    break;
  case 3;
    return new Listener3();
    break;
}

它有效,但我想缩短它。每个新班级都将与之前的班级不同,仅限于前一班级。因此可以动态创建类,如:

return new Listener()+button.getActionListener();

我确定它可能,但是怎么样?我应该使用其中一个Proxy类还是有更简单的方法来实现这一目标?

4 个答案:

答案 0 :(得分:2)

如果这是Java,那么可以使用反射,如果你真的想要...

return Class.forName("packageName.Listener"+theNumber).newInstance();

当然,这样做也可能产生负面影响 - 性能损失,丑陋的代码,调试和可读性问题,必须处理多种异常......

推荐阅读:

答案 1 :(得分:2)

您没有指定任何语言,因此这是一种方式:

const_get("Listener#{button.action_command}").new

但是,我不明白为什么你需要为此动态创建类。根据我的理解,ListenerN类已经存在,您只想动态实例化它们?

如果必须动态创建类,那也不是问题:

const_set("Listener#{button.action_command}", Class.new)

答案 2 :(得分:2)

如果是Java,你可以这样做:

String className = "package.Listener" + button.getActionCommand();
Class theClass = Class.forName(className);
Object theListener = the.newInstance();
return (Listener) theListener;

答案 3 :(得分:0)

即使您在类路径中的某个地方使用Class.forName(...)时,该Listener1,Listener2,Listener3类也必须存在,因此它不适用于随机数,而仅适用于定义了此类的数字。 我假设您希望所有这些不同的类都遵守某些“合同”(= interface),因此您可以定义必须由以下具体类实现的接口:

public interface Listener() {
     public void someExpectedMethod();
}
public class Listener1 implements Listener {
    public void someExpectedMethod() {
        // some implementation logic
    }
}

所以您可以做的是为这些类创建一个静态映射:

static Map<Integer,Class<? extends Listener>> listenerMap=new HashMap<>();
listenerMap.put(1,Listener1.class);
listenerMap.put(2,Listener2.class);

在您的按钮中,您可以:

Listener inst=listenerMap.get(button.getActionCommand()).newInstance();
inst.someExpectedMethod();

还有更多代码,但是您有:

  • 类型检查
  • 您的IDE将发现使用Listener1的地方。