我有以下问题:我想编写一个使用Java反射的框架。我从某处获得类的名称,并想加载该类并创建一个实例。作为一个附加约束,所有有效的类都属于一个共同的超类。
为了保持简单和易懂,我没有发布我所有的类。相反,我编写了一种类似于"MWE"的东西(见下文)。
我该怎么办? 首先,我定义了一个字符串,模拟要加载的类的名称。在我的应用程序中,我从XML文件中获取名称。 表示类必须是给定类的子类(这里是
在这种特殊情况下,忽略警告是可以接受的,我可以添加一个注释来抑制警告。好吧。但通常在Java中有更清晰的解决此类问题的方法。我也可以继续使用
为了保持简单和易懂,我没有发布我所有的类。相反,我编写了一种类似于"MWE"的东西(见下文)。
我该怎么办? 首先,我定义了一个字符串,模拟要加载的类的名称。在我的应用程序中,我从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();
}
}