2

我有一个MyClass带有静态方法的抽象类,可以用许多MyClassDescendant对象填充给定的集合。这个方法应该调用一个静态getRandom()方法MyClassDescendant来获取对象实例。

我当前的代码如下所示:

public static void populate(Collection<MyClass> coll, Class<? extends MyClass> cl, int num) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    for (int i = 0; i < num; i++) {
        Method m;
        m = cl.getMethod("getRandom");
        coll.add((MyClass)(m.invoke(null)));
    }
}

然后我这样称呼它:

MyClass.populate((Collection<MyClass>)(Collection<?>)collection, MyClassDescendant.class, 3);

此代码有效,但很难看。我真正想要达到的效果是这样的:

MyClassDescendant.populate(collection, 3);

如果它不是静态方法,我会使用this.getClass(). 我知道这MyClass.class适用于静态方法,但我不想要classfor MyClass,而是特定的MyClassDescendant(后代类型很少)。

有没有办法在没有实例或类名的情况下获取类对象?

4

3 回答 3

1

由于您处于静态上下文中,因此您必须复制一些代码,但您可以进行委托。

public class MyClassDescendant extends MyClass {
    public static void populate(Collection<MyClass> coll, int count) {
        MyClass.populate(coll, MyClassDescendant.class, count);
    }
}

现在你可以打电话 MyClassDescendant.populate(collection, 3);

于 2013-03-27T19:34:22.610 回答
0

如果 get random 是一个静态方法,你不能直接调用它吗?

public interface MyClassInterface { 
    MyClass getRandom();
}

public abstract class MyClass implements MyClassInterface {
    public static void populate(Collection<MyClass> coll, int num) {
        for (int i = 0; i < num; i++) {            
            coll.add((MyClass)MyClassDescendant.getRandom());
        }
    }
}

public class MyClassDescendant extends MyClass {
    public MyClass getRandom() {
        // implementation of getRandom
    }
}
于 2013-03-27T18:26:38.440 回答
0

尝试以这种方式重组您的方法:

public static <T extends Base> void populate(Collection<T> coll, int num) throws Exception{
    for (T item : coll) {
        Method m;
        m = item.getClass().getMethod("getRandom");
        coll.add((T)(m.invoke(null)));
    }
}

关于注释之一,您还可以使用模板方法getRandom()设计模式通过将其抽象化并在您的填充方法中调用它来为您的方法利用继承。

于 2013-03-27T18:35:58.633 回答