2

我有以下课程。

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,在运行时决定)

我该怎么做呢?

4

4 回答 4

3

您可以使用泛型来声明

Class<? extends A> klass;

然后你就可以写了

A a = klass.newInstance();

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

于 2013-06-26T13:37:53.870 回答
2

我希望将对象转换为子类(B 或 C,在运行时决定)

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

如果你真的想实现一个类型的变量A,那么你只需要转换为A

A a = (A) klass.newInstance();
于 2013-06-26T13:36:25.873 回答
1

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

klass.cast(object)

例如,您有atype B,您a转换为B在运行时加载的类型。

Class<?> klass = Class.forName("B");
klass.cast(a);
于 2013-06-26T13:39:14.823 回答
0

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

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();

或者,如果方法接受参数(例如intand String

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

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

于 2013-06-26T13:45:19.603 回答