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