Class.forName强制转换

在Java中,将Casted结果中的Class.forName用于强制转换为类或被强制转换为类型的对象。 例如,如果你这样做了

Object a; String b = "testing"; a = (Class.forName("java.lang.Object")) b; 

是一个Class的实例还是Object的一个实例?

Class.forName返回一个Class实例。 我相当肯定你引用的代码不能编译,你试图使用函数调用作为强制转换。


更新 :刚想到:如果你问如何在演员表中使用动态加载的类,你基本上不能。 转换(大部分)是编译时的事情。 让动态加载的类实现一个可以编译到代码中然后转换为代码的接口,或者如果你不能这样做,可以使用reflection来访问动态加载的类的成员。

您可以使用类对象的.cast方法进行.cast

 Object a; String b = "testing"; a = Class.forName("java.lang.Object").cast(b); 

但是你似乎对于转换有错误的想法 – 在Java中,转换不会改变任何对象 ,它只是告诉编译器该对象是某种类型的,并且在运行时,VM将测试是否真的如此(如果编译器不能certificate它)。 如果您“作弊”,VM将在此处抛出ClassCastException (它不会转换您的对象)。

(如果涉及原始类型,它会有所不同。)

Class对象的cast方法是同一机制的通用变体。 由于它具有返回类型T (来自Class ),因此这允许通用代码将未知对象强制转换为某种类类型,其中此类对象对应于类型变量。 这对你没有帮助 – Class.forName的返回类型是Class ,这意味着它的强制转换方法只能返回Object

无论如何,转换为java.lang.Object没有任何效果(它将始终成功),而不是将值隐藏到编译器中具有某种特殊类型。 (如果您有重载方法,这可能很重要。)

简单写作

 Object a; String b = "testing"; a = b; 

在这里有同样的效果。

如果需要转换实例,这是一种方法

 String className = "YourClass"; Class someClass = Class.forName( className ); Constructor constructor = (Constructor) someClass.getConstructor(); Object someInstance = constructor.newInstance(); // now you can cast as allways. (YourClass) (someInstance) 

Class.forName始终返回Class