解决方案 »

  1.   

    Person p1 = new Person();
    Class c1 = Person.class;
    Class c2 = p1.getClass();
    c1、c2是Person类的类对象,而这个Person是代码里面引用的test包里面的Person;c3 = Class.forName("test.Person");
    返回test包里的Person类对象。
    所以c2== c3,因为他们都指向同一个类的类对象。如果你写成:c3 = Class.forName("Person");
    那么c3创建的是缺省包(就是没有包)里的Person类对象,所以和test.Person的类对象显然不是一个,也就是说他们根本就不是一个类。正常来讲,后一种写法应该编译报错:Exception in thread "main" java.lang.NoClassDefFoundError: Person (wrong name: t
    est/Person)
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(Unknown Source)
            at java.security.SecureClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.access$100(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Unknown Source)
            at test.TestClass.main(TestClass.java:14)因为你没有定义缺省包的Person。但是如果你编译通过了,只能说明你在缺省包里面也定义了一个Person,就是不带包的Person,你找找你的目录底下看看有没有?或者以前定义过,并且编译了,产生了缺省包的Person.class文件。
      

  2.   

    同意一楼的解释方法。
    虚拟机只会产生一份字节码, 用这份字节码可以产生多个实例对象。
    Class.forName("test.Person");与Class.forName("Person"); 加载的是不同的class文件,即不同的字节码文件。
    可以参考 java获取Class对象的三种方式