我有以下问题:我想编写一个使用java反射的框架。我(从某处)获得一个类的名称,我想加载该类并创建一个实例。作为侧面约束,所有有效的类都属于一个公共超类。
为了保持简单和容易,我不会发布我所有的课程。相反,我编写了某种“MWE”(见下文)。
我该怎么办?
我首先定义一个String
模拟要加载的类的名称。在我的应用程序中,我从 XML 文件中获取名称。
代表类必须是给定类的子类(这里File
就我而言,我有一整棵不同类的树)。
我检查给定名称是否解析为子类的类。如果是的话我应该能够cast the Class<?>
反对Class<File>
目的。
不幸的是日食(因此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();
}
}
您可以使用Class.asSubclass():
Class<? extends File> cls = clsGen.asSubclass(File.class);
File f1 = cls.getConstructor().newInstance();
这是编译时安全的,因为它会抛出ClassCastException
if clsGen
并不是真正的子类File
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)