【问题标题】:In Java, how can I load classes without knowing the name ahead of time?在 Java 中,如何在不提前知道名称的情况下加载类?
【发布时间】:2018-02-06 08:35:53
【问题描述】:

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

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&lt;? extends AbstractProblem&gt;. Found: Class&lt;capture &lt;?&gt;&gt;.

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

【问题讨论】:

  • 对于 number=1,Class.forName("problems.Problem" + number); 的计算结果是什么?您的包结构不会在任何地方反映Capture&lt;&gt;。你也应该分享 ProblemN 模型
  • 我的意思是让它评估为“problems.Problem1”。我还没有听说过 Capture,我会查一下。 “分享 ProblemN 模型”是什么意思?
  • 问题1、2、3的定义就是我的意思。
  • 它们是相当简单的测试用例。它们具有局部变量,例如 testInputOne 和 expectedResultOne。我正计划开设很多类似的课程,所以我宁愿开设一个大型测试班,也不愿开设一打较小的测试班。
  • 问的不是他们的属性而是类的定义,他们都扩展AbstractProblem吗?

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


【解决方案1】:

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

AbstractProblem problem;

然后:

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

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多