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

时间:2017-08-29 02:19:51

标签: java class dynamic syntax dynamic-class-loaders

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

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

所有课程都延伸AbstractProblem。我希望有一个函数接受输入int n并返回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,但我不认为它会自动加载类,就像我想要这个函数一样。感谢。

1 个答案:

答案 0 :(得分:1)

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

AbstractProblem problem;

然后:

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