我有以下问题:我想编写一个使用java反射的框架。我从某个地方得到了一个类的名字,我想加载这个类并创建一个实例。作为一个侧面约束,所有有效的类都属于一个公共超类。如何检查在java中(未检查)强制转换?
为了保持简单和容易,我不发布我所有的课程。相反,我编写了某种“MWE”(见下文)。
我该怎么办? 我首先定义一个String
模拟要加载的类的名称。在我的应用程序中,我从XML文件中获取名称。 表示类必须是给定类的子类(这里是File
,在我的情况下,我有一个单独的类的整个树)。 我检查给定的名称是否解析为一个子类。如果是我应该可以转换Class<?>
对象到Class<File>
对象。 不幸的是eclipse(因此javac
)给出了编译警告。
在这种特殊情况下,可以忽略该警告并且我可以添加一个注释来抑制警告。好吧。但通常在java中有这样的问题更清晰的解决方案。我还可以继续使用Class<?>
并在使用该对象时转换类型(请参阅代码中的示例)。
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectTest extends File
{
private static final long serialVersionUID = 8807535438772463115L;
public ReflectTest()
{
super("","");
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalArgumentException, InvocationTargetException, IllegalAccessException
{
String className = "ReflectTest";
Class<?> clsGen = Class.forName(className);
if(! File.class.isAssignableFrom(clsGen))
{
// Throw some error
System.exit(1);
}
Class<File> cls = (Class<File>) clsGen;
File f1 = cls.getConstructor().newInstance();
//Constructor<?> constructor = clsGen.getConstructor();
//File f2 = (File) constructor.newInstance();
}
}