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
的定义。在哪个源文件中,我可以看到我们使用的成员class
为Foo.class
吗?
答案 0 :(得分:1)
没有源文件。 class
是一个关键字(如this
,instanceof
等),不是任何类的成员,由编译器处理,而不是代码。
答案 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行。您也可以搜索并查看其他人。