我有一个抽象类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
适用于静态方法,但我不希望class
用于MyClass
,而是针对特定的MyClassDescendant
(后代类型很少)。
有没有办法在没有实例或类名的情况下获取类对象?
答案 0 :(得分: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);
答案 1 :(得分:0)
如果获得随机是一种静态方法你不能只调用它吗?
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
}
}
答案 2 :(得分: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)));
}
}
关于一个注释,您还可以使用template method设计模式来为getRandom()
方法利用继承,方法是将其抽象并在您的填充方法中调用它。