package com.imooc.reflect;
public class ClassDemo1 {
public static void main(String[] args){
//Foo的实例对象怎么表示
Foo foo1=new Foo();//foo1就表示出来了
//Foo这个类本身也是Class类的实例对象
//任何一个类都是Class类的实例对象 这三个实例对象有三种表示方式
//第一种--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1=Foo.class;
//第二种 已知该类的对象 通过getClass方法
Class c2=foo1.getClass();
//注意:foo1是Foo类的实例对象;c1和c2是Class类的实例对象即Foo这个类
/*官网说法:c1,c2表示了Foo类的类类型(class type)
*万事万物皆对象
*类也是对象,是Class类的实例对象
*这个对象我们称为该类的类类型
*/
//下面输出的是true 因为不管是c1还是c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
System.out.println(c1==c2);
//第三种表达方式
Class c3=null;
try {
c3=Class.forName("com.imooc.reflace.Foo");
//Class.forName("类的全称")不仅代表了类的类类型,还代表了动态加载类
//要区分编译和运行,编译时刻加载类是静态加载类,运行时刻加载类是动态加载类
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//综上,我们完全可以通过该类的类类型创建该类的实例对象--->通过c1,c2或者c3创建Foo类的实例
try {
Foo foo=(Foo)c1.newInstance();//使用newInstance()方法创建Foo的实例对象,此方法只能调用无参构造
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Foo{}