(自学笔记,持续更新,欢迎指正)
一、关于Class对象
java的每个类被编译成.class文件的时候,java虚拟机(也叫做JVM)会自动为这个类生成一个类对象,这个对象保存了这个类的所有信息(成员变量,方法,构造器,注解,方法参数列表等),以后这个类要想实例化(也就是创建类的实例或创建类的对象)那么都要以这个class对象为蓝图(或模版)来创建这个类的实例,注意,Class只能有一个对象,是单例的。
在此我们也可以这么理解,java说:一切皆对象;因此,class类也是对现实中一种具体事物在java世界的存在形式,就好比现实中有猫,我们就可以造一个Car类,使得在java世界中也存在猫。为了方便理解,在此我们直接把Class类当成每一个.class文件。也就是说,.java文件通过javac编译后生成的每一个.class文件,实际上就是一个class类。一个java文件只能产生一个.class文件(内部类的情况除外),因此,每次我们在程序中创建或者引用class的对象,实际上都是同一个对象。Class只有一个对象,它是单例的。
java程序在运行时需要使用的是.class文件(JVM通过类加载器加载),而与.java文件无关。因此,class类又叫做运行时类,它是java程序运行时,JVM加载磁盘上指定的.class文件。而反射机制,也就类似于反编译的过程:通过目标程序进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路,甚至源代码。反射就是通过JVM编译生成的.class文件,来映射出java文件的内部结构和其他信息,并且通过class这一个蓝图反射创建一个类的对象,调用其中的结构。如:class<?> c=Class.forName("com.pojo.User"); c就是User的类对象,而 User u=new User();这个u就是以c为模版创建的,其实就相当于u=c.newInstance()。
二、反射的基本知识点
以下是反射的基本知识点,这里只提供部分代码,具体的类文件和属性文件这里没给出
初步了解反射
invoke是调用的意思
获取Class类的实例(4种方式)
1.通过运行时类本身的.class属性
2.通过运行时类的一个实例(对象)来获取(使用getClass方法)
3.通过Class的静态方法forName()获取(常用)
4.使用类加载器来创建
类的加载过程:
当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。
类加载器(ClassLoader)是用来把类(class)装载进内存的。JVM 规范定义了两种类型的类加载器:启动类加载器(bootstrap)和用户自定义加载器(user-definedclass loader)。JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,如下图所示:
三个加载器由下至上依次继承。