1.反射的基石-Class类
- JAVA程序中各个JAVA类属于同一类事物,描述该事物的JAVA类名就是Class对比,众多的人用Person表示,众多的JAVA类用Class类表示
Person类表示人,实例对象张三李四具体的人。Class类代表JAVA类,实例对象对应各个类子内存中的字节码,例如:Person类的字节码,ArrayList类的字节码。一个类被类加载器加载到内存中,占用一片存储空间,这个空间内容就是类的字节码,不同的类字节码不同,不同的类在空间内容不同,这一个个空间可以用一个个对象来表示,这些对象有相同的类型。
Class类描述了哪些信息?
-类名,类访问属性,类所属的包名,字段名称的列表,方法名称的列表。
如何得到字节码对应的实例对象(Class类型) - 类名.class,例如System.class
- 对象.getClass().例如new Date.getClass
- Class.forName("类名")例如,Class.forName("java.util.date")反射中主要使用这种
九个预定义Class实例对象 - Int.class=Integer.Type(参考Class.isPrimitive方法的帮助)八个基本类型加void.class
- 数组类型Class实例对象
- 总之,只要在源程序出现的类型,都有各自的Class实例对象,例如int[],void
- public class ClassDemo {
- public static void main(String[] args) throws ClassNotFoundException {
- //返回字节码。如果字节码已经被加载,直接返回,如果没加载,用类加载器加载,然后返回
- Class.forName("java.lang.String");
- String str="abc";
- Class cls1=str.getClass();
- Class cls2=String.class;
- Class cls3=Class.forName("java.lang.String");
- //Class对象相同
- System.out.println(cls1==cls2);//true
- System.out.println(cls2==cls3);//true
- System.out.println(cls1.isPrimitive());//false
- //指定的 Class 对象是一个基本类型
- System.out.println(int.class.isPrimitive());//true
- //不同的Class对象,不同字节空间
- System.out.println(int.class==Integer.class);//false
- //Integer.TYPE表示它所包装的基本类型
- System.out.println(int.class==Integer.TYPE);//true
- //int[]是数组类型
- System.out.println(int[].class.isPrimitive());//false
- System.out.println(int[].class.isArray());//true
- }
- }
复制代码 2.理解反射的概念反射就是把类类各种成分映射成相应的JAVA类,例如,一个JAVA类中用一个Class类的对象表示,一个类的组成部分:成员变量,方法,构造方法,包等信息也用JAVA表示。表示JAVA类的Class类显然提供了一系列的方法,获取其中的变量,方法,构造方法,修饰符,包等信息。这些信息就是用响应类的实例对象表示。他们是Field,Method,Contructor,Package等
一个类中的,每个成员都可以用相应的反射API类的一个实例对象表示。调用Class类对象可以得到这些成员的实例对象。
|