在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象(Class类不能人为创建由JVM自动调用),用于表示这个类的类型信息。所以说:类也是对象,并且它是java.lang.Class类的实例对象。获取Class实例对象主要有三种方式:
package reflectTest;
public class ClassDemo {
public static void main(String[] args) {
//Foo的实例对象如何表示,可以通过如下我们熟知的方式
Foo foo1 = new Foo();
//但是Foo这个类其实也是一个实例对象,它是Class类的实例对象
//其实任何一个类都是Class的实例对象,这个实例对象我们称为对应类的类类型(class tyoe)
//实例对象有三种表示方式
//第一种表示方式:实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1 = Foo.class;
//第二种表示方式 : 已经知道该类的对象通过getClass方法
Class c2 = foo1.getClass();
//第三种表示方式:可以用来实现类的动态加载
Class c3 = null;
try {
c3 = Class.forName("reflectTest.Foo");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//不管c1,c2,c3都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
System.out.println(c1 == c2); //输入true
System.out.println(c2 == c3); //输出true
//可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象
try {
Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法
foo.print(); //输出foo
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Foo{
void print(){
System.out.println("foo");
}
}
其实不止类有类类型,基本数据类型和像void这些关键字也有类类型:
package reflectTest;
public class ClassDemo2 {
public static void main(String[] args) {
Class c1 = int.class;//int 的类类型
Class c2 = String.class;//String类的类类型
Class c3 = double.class;
Class c4 = Double.class;
Class c5 = void.class; //void的类类型
System.out.println(c1.getName()); //输出int
System.out.println(c2.getName()); //输出java.lang.String
System.out.println(c2.getSimpleName());//不包含包名的类的名称,输出String
System.out.println(c5.getName());// 输出void
}
}