我有以下问题:我想编写一个使用java反射的框架。我(从某处)得到一个类的名称,我想加载该类并创建一个实例。作为边约束,所有有效的类都属于公共超类。
为了简单易行,我不发布所有课程。相反,我编写了一些" MWE" (见下文)。
我该怎么办?
我首先定义一个String
来模拟要加载的类的名称。在我的应用程序中,我从XML文件中获取名称。
表示类必须是给定类的子类(在我的情况下,File
我有一整个单独的类树)。
我检查给定的名称是否解析为一个子类。如果是,我应该将<{1}}对象转换为Class<?>
对象。
不幸的是,eclipse(以及Class<File>
)给出了编译警告。
在这种特殊情况下,可以忽略警告,我可以添加注释来抑制警告。行。但通常在java中有一个更清晰的解决方案来解决这些问题。我还可以继续使用javac
并在使用对象时再次使用该类型(请参阅代码中的示例)。
Class<?>
答案 0 :(得分:4)
您可以使用Class.asSubclass()
:
Class<? extends File> cls = clsGen.asSubclass(File.class);
File f1 = cls.getConstructor().newInstance();
这是编译时安全的,因为如果ClassCastException
实际上不是clsGen
的子类,它将抛出File
。