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

Java 如何在没有实例或类名的情况下获取类对象,java,class,static,Java,Class,Static,我有一个抽象类MyClass,它有一个静态方法,用大量myclassgenderant对象填充给定集合。此方法应调用myclassgender的静态getRandom()方法来获取对象实例 我当前的代码如下所示: public static void populate(Collection<MyClass> coll, Class<? extends MyClass> cl, int num) throws NoSuchMethodException, IllegalAc

我有一个抽象类
MyClass
,它有一个静态方法,用大量
myclassgenderant
对象填充给定集合。此方法应调用
myclassgender
的静态
getRandom()
方法来获取对象实例

我当前的代码如下所示:

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)));
    }
}
MyClassDescendant.populate(collection, 3);

如果它不是静态方法,我只会使用
this.getClass()
。我知道
MyClass.class
可以用于静态方法,但我不希望
class
用于
MyClass
,而是用于特定的
myclasssubstant
(很少有后代类型)


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

如果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
    }
}
公共接口MyClassInterface{
MyClass getRandom();
}
公共抽象类MyClass实现MyClassInterface{
公共静态void填充(集合coll,int num){
对于(inti=0;i
尝试用以下方式重新构造方法:

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)));
    }
}
publicstaticvoidpopulate(Collection coll,int num)引发异常{
对于(T项:coll){
方法m;
m=item.getClass().getMethod(“getRandom”);
coll.add((T)(m.invoke(null));
}
}

对于注释中的一个,您还可以使用设计模式通过将
getRandom()
方法抽象化并在您的populate方法中调用它来利用继承。

由于您处于静态上下文中,您必须复制一些代码,但您可以执行委派

public class MyClassDescendant extends MyClass {
    public static void populate(Collection<MyClass> coll, int count) {
        MyClass.populate(coll, MyClassDescendant.class, count);
    }
}
公共类MyClassDegenant扩展了MyClass{
公共静态void填充(集合coll、int计数){
填充(coll,myclassgenderant.class,count);
}
}
现在你可以打电话了
myclassgenderant.populate(集合,3)

由于基类中的方法
populate()
是静态的,因此不能在派生类中重写它。相反,您可以在每个派生类中实现它,以使用该类的实例填充集合。是的,这是可行的,但我希望避免在多个类之间复制粘贴几乎相同的代码。您总是在静态上下文中调用它吗?您不能覆盖静态方法,您只能隐藏它们。。。如果确实要重写它们,则需要将其设置为非静态,您要么必须复制代码,要么必须向方法提供类,因为集合没有关于其项类型的任何信息,因为泛型在Java中是通过类型擦除实现的。
MyClassDegenant
不是唯一的子体,这类人很少。
MyClass
中的静态抽象方法
getRandom()
可以解决这个问题(我认为),但是Java不允许静态抽象方法。如果您想要多个子级,每个子级都有一个getRandom方法,您应该创建一个接口并让MyClass实现它。您将遇到并发修改异常,因为您正在修改当前迭代的集合。此外,如果集合为空,则永远不会调用getRandom。@LeonardBrünings,这完全取决于传入的是什么类型的
集合。您的第二条评论是正确的,似乎这是预期的功能。如果我理解您在那里做了什么,此方法将迭代集合中的每个元素,并创建其类的新随机实例。这不是我想做的。集合应该包含多种类型的
MyClass
子体,并且
populate()
应该添加一些特定类的实例。@gronostaj感谢您澄清了您对该方法的期望。
public class MyClassDescendant extends MyClass {
    public static void populate(Collection<MyClass> coll, int count) {
        MyClass.populate(coll, MyClassDescendant.class, count);
    }
}