0

我想使用 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();

我敢肯定它是可能的,但如何?我应该使用其中一个代理类还是有更简单的方法来实现这一点?

4

4 回答 4

2

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

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

当然,这样做也可能产生不利影响——性能下降、代码丑陋、调试和可读性问题、不得不处理多种异常......

推荐阅读:

于 2013-01-15T15:29:42.997 回答
2

您没有指定任何语言,所以这是一种方法:

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

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

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

const_set("Listener#{button.action_command}", Class.new)
于 2013-01-15T15:30:24.753 回答
2

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

String className = "package.Listener" + button.getActionCommand();
Class theClass = Class.forName(className);
Object theListener = the.newInstance();
return (Listener) theListener;
于 2013-01-15T15:31:34.233 回答
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 的情况。
于 2019-05-02T11:57:31.993 回答