![](/img/trans.png)
[英]Java dynamic class casting using visitor pattern or reflection? Missing steps or bad implementation?
[英]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
我希望将对象转换为子类( B
或C
,由运行时决定)
我该怎么做呢?
您可以使用泛型来声明
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();
或者,如果该方法接受参数(例如int
和String
)
int param1 = ...;
String param2 = ...;
klass.getMethod(a, new Class[] { Integer.class, String.class }).invoke(param1, param2);
当然,您需要捕获适当的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.