查询Class类的实例

时间:2014-06-20 06:25:56

标签: java class

Java中的每个对象都属于某个类。这就是为什么Object类(由所有其他类继承)定义getClass()

getClass()方法返回Class类的实例。

例如:

class Foo{}
class Sample{ class Foo instance = Foo(); Class obj = instance.getClass(); }

获取Class类实例的另一种方法是说Foo.class

我的问题:

我可以在getClass()类源代码(File Object.java包java.lang)中看到Object的定义。在哪个源文件中,我可以看到我们使用的成员classFoo.class吗?

2 个答案:

答案 0 :(得分:1)

没有源文件。 class是一个关键字(如thisinstanceof等),不是任何类的成员,由编译器处理,而不是代码。

答案 1 :(得分:0)

如果对象的实例可用,那么获取其Class的最简单方法是调用Object.getClass()

Foo foo=new Foo();
Class c = foo.getClass();

如果类型可用但没有实例,则可以通过将.class附加到类型名称来获取类。这也是获取基本类型Class的最简单方法。

boolean b;
Class c = boolean.class; 

这会产生编译时错误

Class c = b.getClass();   

因为布尔值是基本类型而无法解除引用

对于像这样的事情

Foo foo=null;

请注意,在这种情况下,您无法使用foo.getClass(),因为它未实例化。

最后是这样的事情

Foo foo=new FooChild();
Class c= foo.getClass(); //returns FooChild, evaluates at runtime
Class c= Foo.class;// returns Foo , evaluates statistically at compile-time.

编辑: - 对于.class,它是每个基本类型中的静态字段static Class<Integer>,表示整数的Class实例。您可以在此处查看Integer,此处查看Boolean。 boolean,byte,char,short,int,long,float和double它们都有一个Class静态字段,因为就像我说它总是保持不变而原始类型不能被解除引用。要查看来源,如果您看到Integer的来源,则可以将类字段视为public static final Class<Integer> TYPE = (Class<Integer>) VMClassLoader.getPrimitiveClass('I');,请参阅here第82行。您也可以搜索并查看其他人。