有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中使用反射强制转换类

我有以下课程

abstract class A{}

class B extends A{}

class C extends A{}

我需要创建一个这样的对象

A a = new B();

我在运行时得到子类的类名。所以,我需要使用反射来创建一个对象

我已经做到了

Class<?> klass = Class.forName(className);

现在我无法将这个类转换为子类

我想实现

A a = klass.newInstance(); // returns Object

我希望将对象强制转换到子类中(或者B或者C,由运行时决定)

我该怎么做


共 (2) 个答案

  1. # 1 楼答案

    可以使用泛型来声明

    Class<? extends A> klass;
    

    那你就可以写作了

    A a = klass.newInstance();
    

    但是,由于Class.forName没有关于类的类型信息,也没有声明类型推断,因此您将收到“unchecked cast”警告。这种方法的类型安全性并不比将第二行的结果向下转换为A更高

  2. # 2 楼答案

    拥有类型为Class<T>klass对象,您可以调用^{}方法,使用

    klass.cast(object)
    

    例如,您有a类型的B,您在运行时将a强制转换为B类型

    Class<?> klass = Class.forName("B");
    klass.cast(a);