Class
1、Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性
2、对象照镜子后(反射)可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
3、对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。
一个 Class 对象包含了特定某个类的有关信息。
4、Class 对象只能由系统建立对象
5、一个类在 JVM 中只会有一个Class实例
反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
packagereflection_demo1;classPerson {}public classDemo{public static voidmain(String[] args) {
Person per= new Person() ; //正着操作
System.out.println(per.getClass().getName()); //反着来 输出: reflection_demo1.Person
}
}
以上的代码使用了一个getClass()方法,而后就可以得到对象所在的“包.类”名称,这就属于“反”了,但是在这个“反”的操作之中有一个getClass()就作为发起一切反射操作的开端。
Person的父类是Object类,而上面所使用getClass()方法就是Object类之中所定义的方法。
·取得Class对象:public final Class> getClass(),反射之中的所有泛型都定义为?,返回值都是Object。
而这个getClass()方法返回的对象是Class类的对象,所以这个Class类就是所有反射操作的源头。但是在讲解其真正使用之前还有一个需要先解释的问题,既然Class是所有反射操作的源头,那么这个类肯定是最为重要的,而如果要想取得这个类的实例化对象,Java中定义了三种方式:
一 获取Class类的实例化对象
方式一:通过Object类的getClass()方法取得,基本不用:
packagereflection_demo1;classPerson {}public classDemo{public static voidmain(String[] args) {
Person per= new Person() ; //正着操作
Class> cls = per.getClass() ; //反着来 取得Class对象
System.out.println(cls.getName());
}
}
方式二:使用“类.class”取得
packagereflection_demo1;classPerson {}public classDemo{public static voidmain(String[] args) {
Class> cls = Person.class; //反着来 取得Class对象
System.out.println(cls.getName());
}
}
方式三:使用Class类内部定义的一个static方法,主要使用
·取得Class类对象:public static Class> forName(String className) throws ClassNotFoundException;
packagereflection_demo1;classPerson {}public classDemo{public static void main(String[] args) throwsException {
Class> cls = Class.forName("reflection_demo1.Person") ; //反着来 取得Class对象
System.out.println(cls.getName());
}
}
二 通过反射实例化对象
那么现在一个新的问题又来了,取得了Class类的对象有什么用处呢?对于对象的实例化操作之前一直依靠构造方法和关键字new完成,可是有了Class类对象之后,现在又提供了另外一种对象的实例化方法:
通过反射实例化对象:public T newInstance() throws InstantiationException, IllegalAccessException;
范例:通过反射实例化对象
packagereflection_demo1;classPerson {
@OverridepublicString toString() {return"Person Class Instance.";
}
}public classDemo{public static void main(String[] args) throwsException {
Class> cls = Class.forName("reflection_demo1.Person") ; //取得Class对象
Object obj = cls.newInstanc