2014-04-18 38 views
4

我有以下问题:我想编写一个使用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(); 
    } 
} 

回答

4

您可以使用Class.asSubclass()

Class<? extends File> cls = clsGen.asSubclass(File.class); 
File f1 = cls.getConstructor().newInstance(); 

这是编译时安全的,因为它会抛出ClassCastException如果clsGen是不是真的File一个子类。