从java中的子类一般创建实例的方法

时间:2014-10-28 17:54:12

标签: java generics

我有一个抽象的超类:

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); ...

尝试使用泛型可能是错误的。不确定在主类

中避免所有这些重复的正确方法是什么

2 个答案:

答案 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");
    }
}

查看ClassMethod的文档。使用反射来调用谓词(在您的示例中为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();
        }
    }
}