如何在没有实例或类名的情况下获取类对象

时间:2013-03-27 18:14:40

标签: java class static

我有一个抽象类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(后代类型很少)。

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

3 个答案:

答案 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()方法利用继承,方法是将其抽象并在您的填充方法中调用它。