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

标签 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,但我不认为它会像我希望这个函数那样自动加载类。谢谢。

最佳答案

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

AbstractProblem problem;

然后:

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

关于java - 在Java中,如何在不提前知道名称的情况下加载类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45929754/

相关文章:

javascript - Rails 动态形式远程真实 Controller 没有响应

Ruby 动态类。如何修复 "warning: class variable access from toplevel"

c# - 为什么我不能将 Debug.Assert() 与接受动态并返回 bool 的方法一起使用?

java - 在Java中创建线程

java - 在 jtextfield 中验证 'price' 的正则表达式是什么

class - 如何在 Powershell 5 类中声明静态成员?

java - 如何访问属于 ArrayList 的对象的一部分?

java - CXF拦截器阶段用于清理MDC

java - 如何使用 JAXB 生成其元素可以包含字符串或 XML 的类?

php - 与类同名的 PHP 类中的初始函数的目的是什么?