package com.hey.reflect;
/**
* 1、万事万物皆对象,class类同样是Class类的实例对象,比如说一个Student类是Class的实例对象(类是对象,是java.lang.Class类的实例对象)
*
* 2、有三种方式获取一个类的类类型
*
* 3、我们可以通过类的类类型,创建类的实例对象
*
*/
public class ReflectDemo {
public static void main(String[] args) {
//Foo的实例对象怎么表示?
Foo foo1 = new Foo();
/**
* Foo这个类是一个对象,是java.lang.Class类的实例对象(任何一个类都是Class类的实例对象),有以下三种获取方式
*/
//第一种方式(实际在告诉我们每个类都有一个隐含的静态成员变量class)
Class c1 = Foo.class;
//第二种方式(已知该类的对象,通过getClass()方法获取)
Foo foo = new Foo();
Class c2 = foo.getClass();
System.out.println(c1 == c2); //返回true
//第三种方式(已知类名,通过forName()方法获取)
Class c3 = null;
try {
c3 =Class.forName("com.hey.reflect");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c2 == c3);//返回true
//c1、c2、c3表示了Foo类的类类型(指的是Foo类本身),一个类只可能是Class类的一个实例对象
/**
* 我们可以通过类的类类型调用newInstance()方法创建类的实例对象(前提是该类有一个无参的构造方法)
*/
try {
Foo foo2 = (Foo)c1.newInstance();
foo2.print();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Foo {
void print () {
System.out.println("foo");
}
}