Class.forName强制转换

Joh*_*Don 5 java reflection casting class

在Java中,将在投射结果中使用Class.forName将对象强制转换为类或者将其强制转换为所发现的强制转换.例如,如果你这样做了

Object a;
String b = "testing";
a = (Class.forName("java.lang.Object")) b;
Run Code Online (Sandbox Code Playgroud)

会成为Class的实例还是Object的实例?

T.J*_*der 10

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


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


Paŭ*_*ann 9

您可以使用类对象的.cast方法进行强制转换:

Object a;
String b = "testing";
a = Class.forName("java.lang.Object").cast(b);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

简单写作

Object a;
String b = "testing";
a = b;
Run Code Online (Sandbox Code Playgroud)

在这里有同样的效果.