在 Java 中,如何在事先不知道名称的情况下加载 类?

In Java, how can I load classes without knowing the name ahead of time?

我有一个如下所示的目录:

src
|
|__ProblemTester.java
|
|__problems
   |
   |__AbstractProblem.java
   |
   |__Problem1.java
   |
   |__Problem2.java
   |
   |__Problem3.java

所有 类 扩展 AbstractProblem。我想要一个函数,它接受输入 int n 和 returns 一个 ProblemN.java 的实例(作为测试框架的一部分)。这可能吗?

到目前为止我的代码:(非常粗糙)

class ProblemTester {

    Class<? extends AbstractProblem> problem;

    ProblemTest(int number) throws IllegalArgumentException {
        try {
            problem = Class.forName("problems.Problem" + number);
        } catch (ClassNotFoundException e) {
             throw new IllegalArgumentException(String.format("Problem %d not found.", number));
        }
    }

不幸的是,这会引发错误 Incompatible types. Required: Class<? extends AbstractProblem>. Found: Class<capture <?>>.

我该如何解决这个问题?是否有这样的现有框架?我过去使用过 gradle,但我认为它不会像我希望此功能那样自动加载 类。谢谢。

我可能是错的,但据我所知,泛型并不打算用作元类型(类),所以你可以做的是,将你的问题声明为:

AbstractProblem problem;

然后:

Class clazz = Class.forName("Problem" + number);
problem = (AbstractProblem) clazz.newInstance();