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允许它。