我想使用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类还是有更简单的方法来实现这一目标?
答案 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();
还有更多代码,但是您有: