在 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();
我有一个如下所示的目录:
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();