在学习Java的过程当中,我们经常会听到一句话叫做:万事万物皆为对象。在Java的世界当中,除了类的静态成员和普通的数据类型之外,其余的皆为对象。
于是乎,就可以知道我们定义的每一个类都是一个对象,而这些类是谁的对象呢?他就是今天要说的Class类,我们定义的每一个类都是Class类的对象。
package com.example.Reflect;
public class ReflectDemo1 {
public static void main(String[] args) {
/**
* Demo的实例对象
*/
Demo demo1 = new Demo();
/**
* Demo类也是一个对象 它是Class类的对象 任何一个类都是Class类的实例对象,这对象有三种表示方式
*/
// 第一种表示方式-->实际告诉我们任何一个类都含有一个隐含的静态成员变量
Class c1 = Demo.class;
// 第二种表示方式-->通过类的对象来创建class对象
Class c2 = demo1.getClass();
/**
* 官网上给了我们一个关于c1和c2的概念 -->c1和c2表示的是该类的类型型。 相较于demo1,他则是该类的对象。
*/
// 第三种表示方式
Class c3 = null;
try {
c3 = Class.forName("com.example.Reflect.Demo");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(c1 == c2);
System.out.println(c1 == c3);
// 我们还可以通过该类的类型来创建该类的对象-->也就是说,我们可以通过c1、c2、c3来创建Demo类的对象。
try {
Demo demo2 = (Demo) c3.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Demo {
}
例如上面的这个例子,我们定义了一个Demo类,并且通过new的方式类创建了Demo类的一个对象。就Demo类本身来说,它也是一个类的对象--Class类的对象。而Demo这个对象比较特殊,那就是它不能直接使用--不能像其他对象一样,通过对象名来使用,而是由其他的方式将这个类转换为Class类的对象。这里就三种方式:
1.通过类名.class可以获得该类对应的Class对象
Class c1 = Demo.class;
2.通过该类的对象来创建该类对应的Class对象
lass c2 = demo1.getClass();
3.通过Class类的forName方式创建
c3 = Class.forName("com.example.Reflect.Demo");
这里还要做一个解释,类的对象和类的本身的区别:
它们都是对象,只是属于不同类的对象。类的对象就是通过new方式产生一个对象,这个对象指向的该类,表示该类的对象;而类本身是Class类的对象,由上面的三种方式产生的Class对象是Demo类的类类型。
4.通过类的类型类的还可以产生该类的对象
// 我们还可以通过该类的类型来创建该类的对象-->也就是说,我们可以通过c1、c2、c3来创建Demo类的对象。
try {
Demo demo2 = (Demo) c3.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}