java反射 之Class类
任何一个类都是Class的实例对象,这个实例对象有三种表示方法
第一种方法表示
实际在告诉我们任何一个类都有一个隐含的静态成员
Class c1 = Foo.class;
查看Class类的源码
/*
* Constructor. Only the Java Virtual Machine creates Class objects.
*
* */
private Class() {}
第二种表达方式
已知道该类的对象通过个getClass方法
Class c2 = foo1.getClass();
// 官网 c1,c2表示了Foo类的类类型(ClassType) 类也是对象,
// 是Class类的实例对象 这个对象我们称之为类类型
测试c1 c2
System.out.println(c1 == c2);
输出 true 不管c1 c2 都代表类的类类型,一个类只可能是Class类的一个实例对象
第三种表达方式
Class c3 = null;
try {
c3 = Class.forName("reflect.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
测试c2 c3
System.out.println(c2 == c3);
输出true 可以通过类的类类型创建该类的对象实例--->通过c1 c2 c3 创建Foo的实例
try {
Foo foo = (Foo) c1.newInstance();//需要无参数的构造方法
foo.print(); //调用方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
完整代码
package reflect;
/**
* Class类
*
* @thor wangb
*
*/
public class ClassDemo1 {
public ClassDemo1() {
}
public static void main(String[] args) {
// Foo的实例对象如何表示
Foo foo1 = new Foo();
/*
* Constructor. Only the Java Virtual Machine creates Class objects.
*
* private Class() {}
*/
// 任何一个类都是Class的实例对象,这个实例对象有三种表示方法
// 第一种方法表示 实际在告诉我们任何一个类都有一个隐含的静态成员
Class c1 = Foo.class;
// 第二种表达方式 已知道该类的对象通过个getClass方法
Class c2 = foo1.getClass();
// 官网 c1,c2表示了Foo类的类类型(ClassType) 类也是对象,
// 是Class类的实例对象 这个对象我们称之为类类型
System.out.println(c1 == c2); // 输出 true 不管c1 c2 都代表类的类类型,
// 一个类只可能是Class类的一个实例对象
Class c3 = null;
try {
c3 = Class.forName("reflect.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c2 == c3);// 输出true
// 我们可以通过类的类类型创建该类的对象实例--->通过c1 c2 c3 创建Foo的实例
try {
Foo foo = (Foo) c1.newInstance();//需要无参数的构造方法
foo.print(); //调用方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Foo {
void print() {
}
}