Class.forName强制转换

时间:2011-07-24 16:35:04

标签: java class reflection casting

在Java中,将在投射结果中使用Class.forName将对象强制转换为类或者强制转换为找到的强制转换。例如,如果你这样做

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

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

4 个答案:

答案 0 :(得分:10)

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


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

答案 1 :(得分:9)

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

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

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

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

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

无论如何,转换为java.lang.Object没有任何效果(它总会成功),除了将编译器隐藏到该值具有某种特殊类型。 (如果你有重载方法,这可能很重要。)

简单写作

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

在这里也有同样的效果。

答案 2 :(得分:2)

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

import pandas as pd
import numpy as np
import glob
from sys import argv
script, file_location, outpath = argv

files = glob.glob(file_location +  "*.xlsx")
all_data = pd.DataFrame()

for f in files:
    df = pd.read_excel(f)
    all_data = all_data.append(df)
    all_data.to_excel(outpath + ".xlsx")

答案 3 :(得分:1)

Class.forName始终返回