我有各种单例模式的类。它们都是从抽象类扩展而来的。每个类都有一个getInstance()方法(具有完全相同的名称)。我想用类名(String)获取实例。例如
public abstract class AbsCls {
}
public class A extends AbsCls {
private static A a;
private A() {
}
public synchronized static A getInstance() {
if(a==null) {
a == new A();
}
return a;
}
public class Test {
public static void main(String[] args) {
AbsCls[] array = new AbsCls[5];
array[0]=neededFunction("A");
array[1]=neededFunction("B");
}
}
所有类与A类具有相同的结构。应该如何使用requiredFunction()?
我可以写“if .. else”,但我觉得应该有更优雅的方式。谢谢你提前帮忙......
答案 0 :(得分:1)
您可以使用package.ClassName
,反射和Class.forName(theName)
中的完整班级名称。
例如使用String
对象:
try {
String newString = (String)Class.forName("java.lang.String").newInstance();
}
catch (IllegalAccessException iae) {
// TODO handle
}
catch (InstantiationException ie) {
// TODO handle
}
catch (ClassNotFoundException cnfe) {
// TODO handle
}
所以你的方法可能大致如下:
@SuppressWarnings("unchecked")
public static <T> T getInstance(String clazz) {
// TODO check for clazz null
try {
return (T)Class.forName(clazz).getMethod("getInstance", (Class<?>[])null).invoke(null, (Object[])null);
}
catch (ClassNotFoundException cnfe) {
// TODO handle
return null;
}
catch (NoSuchMethodException nsme) {
// TODO handle
return null;
}
catch (InvocationTargetException ite) {
// TODO handle
return null;
}
catch (IllegalAccessException iae) {
// TODO handle
return null;
}
}
OP的编辑:
(Class<?>[])null
和(Object[])null
是null
个参数,被视为预期类型。
基本上:
答案 1 :(得分:0)
AbsCls[] array = new AbsCls[5]; // this create object for AbsCls
array[0]=neededFunction("A"); // calling method from AbsCls
array[1]=neededFunction("B");// calling method from AbsCls
如果为超类创建对象,则无法从子类中获取方法
AbsCls[] array = new A[5]; //this create object for A
如果要调用超类方法用户super
关键字
array[0]=neededFunction("A"); //// calling method from A
array[1]=super.neededFunction("B");//// calling method from AbsCls