我有一个抽象的超类:
class abstract Father{
public static boolean controll(){here comes code....}
}
class child1 extends Father{
public static boolean controll(){
does something....
Father.controll();
}}
在我的主要课程中,我会启动这样的孩子
if(Child1.controll()){ new Child1().callingOtherMethod()}
if(Child2.controll()){ new Child2().callingOtherMethod()}
等等很多次......
我对仿制药仍然很陌生,并不是很了解它。 我如何在我的主类中编写一个更通用的方法,它做了类似的事情:
public void moveToStep(Class<? extends Father> clasz){
if(clasz.controll())
new clasz().callingOtherMethod() }
所以我可以用更短的形式来称呼它:
moveToStep(Child1.class); moveToStep(Child1.class); ...
尝试使用泛型可能是错误的。不确定在主类
中避免所有这些重复的正确方法是什么答案 0 :(得分:0)
您要查找的代码位于java.lang.reflect中。您可以尝试使用
http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#newInstance--
仅当存在null构造函数时才会起作用。否则你需要找到一个构造函数,也使用反射来计算传递给它的值。
答案 1 :(得分:0)
首先,在超类中包含要作为抽象调用的方法。
abstract class Father {
public static boolean predicate() { /*...*/ }
protected abstract void method();
}
然后,确保您的子类包含一个空构造函数。
final class Child1 extends Father {
Child1() { /*...*/ }
public static boolean predicate() { return true; }
@Override
public void method() {
System.out.println("Child1");
}
}
查看Class
和Method
的文档。使用反射来调用谓词(在您的示例中为controll
),然后newInstance
来实例化一个类并调用另一个方法。
public static void main(String[] args) {
List<Class<? extends Father>> children =
Arrays.asList(Child1.class, Child2.class);
for (Class<? extends Father> c: children) {
try {
Method pred = c.getDeclaredMethod("predicate");
Boolean b = (Boolean) pred.invoke(null);
if (b.booleanValue()) {
Father f = (Father) c.newInstance();
f.method();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}