类Class的实例

时间:2013-09-01 15:00:50

标签: java class reflection

我对类Class

的实例有几个问题

1)我是否理解正确地说类Dog只有一个Class类的实例。换句话说,给出以下几行

Dog dog1 = new Dog();
Dog dog2 = new Dog();

Class dog1Class = dog1.getClass();
Class dog2Class = dog2.getClass();
Class dogClass = Dog.class;

类Class只有一个实例 - Class<Dog>

如果将这些引用与==进行比较,则表明它们是同一个对象。

确切的问题是,getClass和static .class在执行main方法时总会返回相同的实例吗?

2)何时创建了这些实例?

2 个答案:

答案 0 :(得分:5)

  

将getClass和static .class始终返回相同的实例

不,不完全是。 dog.getClass()方法返回dog的运行时类型。

考虑以下课程:

class Animal { }
class Dog extends Animal { }

然后在主要方法中:

Animal dog = new Dog();     
System.out.println(dog.getClass());   // Prints class Dog
System.out.println(Animal.class);     // Prints class Animal

  

何时创建这些实例?

当JVM首次加载该类时。来自Class的文档:

  

类对象由Java虚拟机在加载类时自动构造,并通过调用类加载器中的defineClass方法来构建。

详细研究:

答案 1 :(得分:1)

只有一个Class实例代表一个类;无论你如何得到它,你都可以放心,它是同一个实例。

例如,静态同步方法使用该确切实例进行锁定;显然,如果有多个实例,它将无法工作。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6