繁体   English   中英

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

[英]Casting a class using reflection in 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

我希望将对象转换为子类( BC ,由运行时决定)

我该怎么做呢?

您可以使用泛型来声明

Class<? extends A> klass;

那你就可以写

A a = klass.newInstance();

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

我希望将对象强制转换为子类(B或C,取决于运行时)

这是没有意义的。 强制转换主要是编译时操作,最终得到适当类型的表达式。 然后在执行时进行验证。

如果您确实在尝试实现类型A的变量,则只需要强制转换为A

A a = (A) klass.newInstance();

具有类型为Class<T> klass对象,您可以调用Class.cast()方法来Class.cast()转换为类型T

klass.cast(object)

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

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

要跟进评论,您可以使用以下任一方法创建类的实例

Class klass = Class.forName(className);
A a = (A)klass.newInstance();

要么

Class<? extends A> klass = Class.forName(className);
A a = klass.newInstance();

然后,您可以使用以下方法在其上调用方法:

klass.getMethod(methodName, null).invoke();

或者,如果该方法接受参数(例如intString

int param1 = ...;
String param2 = ...;
klass.getMethod(a, new Class[] { Integer.class, String.class }).invoke(param1, param2);

当然,您需要捕获适当的异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM