Java 用类加载器加载数组
我正在尝试运行以下代码:Java 用类加载器加载数组,java,class,classloader,loader,Java,Class,Classloader,Loader,我正在尝试运行以下代码: public class ClassLoaderTest { public static void main(String[] args) throws Exception { Object[] obj = new Object[]{}; String cname = obj.getClass().getName(); System.out.println(cname); ClassLoaderTest.class.getCla
public class ClassLoaderTest
{
public static void main(String[] args) throws Exception
{
Object[] obj = new Object[]{};
String cname = obj.getClass().getName();
System.out.println(cname);
ClassLoaderTest.class.getClassLoader().loadClass(cname);
}
}
但它抛出了一个ClassNotFoundException。有趣的是,如果我用这句话:
Class.forName(cname);
它很好用
这是怎么回事
编辑:
我正在使用Java6。println
打印:
[Ljava.lang.Object;
它们根本不一样,
Class.forName
返回与给定名称的类关联的Class对象
在您的示例中,您给了loadClass
一个表示类名称的String
,而不是直接给它一个类
此方法允许您指定名称,但它必须是类的名称,而不仅仅是类名
作为字符串参数提供给ClassLoader中的方法的任何类名都必须是Java语言定义的二进制名称™ 语言规范。首先,使用类加载器尝试加载
java.lang.Object
数组不太可能工作(因为java.lang.Object
是由默认类加载器加载的)。接下来,由
Object[] obj = new Object[]{};
String cname = obj.getClass().getName();
System.out.println(cname);
是[Ljava.lang.Object;
。很明显,这不是一个可以由a解析的类-javadoc说(部分)类加载器是一个负责加载类的对象;请注意,它并不是说它负责加载数组。在反射中,处理数组的部分原因是,数组
类提供了静态方法来动态创建和访问Java数组。这似乎就是您要找的。查看e,它似乎正在尝试构建类的文件名,如下所示:
String path = name.replace('.', '/').concat(".class");
考虑到
cname
的值是[Ljava.lang.Object;
,我并不特别惊讶.class
文件找不到。我猜你问这个问题是出于好奇,因为在java数组中,“类”是由vm生成的,所以加载它们没有意义。(您将加载组件类,然后创建一个数组,vm将创建数组类)数组类型的可能副本确实是一个类;class.forName()
javadoc允许它。