java反射之基础知识点

(自学笔记,持续更新,欢迎指正)

一、关于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()。

java.lang.class是反射的源头
我们创建了一个类,通过编译(javac.exe)生成对应的.class文件,之后我们使用java.exe加载(JVM的类加载器完成的)此class文件加载到内存以后,就是一个运行时类,存在缓存区。那么这个运行类本身就是一个Class的实例!
1.每一个运行时类只加载一次,
2.有了class实例以后,我们才可以进行如下的操作(由.class文件产生不同的对象)
1)*创建对应的运行时类的对象
2)获取对应的运行时类的完整结构(属性、方法、构造器、内部类、父类、所在的包、异常、注解。。。。)
3)*调用对应的运行时类的指定的结构(属性、方法、构造器)
4)反射的应用:动态代理


二、反射的基本知识点

以下是反射的基本知识点,这里只提供部分代码,具体的类文件和属性文件这里没给出

初步了解反射

java反射之基础知识点_第1张图片
class类表示class文件,这里需要使用person强转,如果Class是泛型Class的话就不用强转,否则就默认Object类
Person的属性age是private的情况下,如果直接使用getField方法(必须是public),会报NoSuchFieldException错误,这时候可以改用getDeclareField方法,这个方法只要是声明的属性就可以调用,但是还是会报IllegalAccessException错,表示非法访问,于是需要多加一步设置合法,setAccessible(true)

java反射之基础知识点_第2张图片

invoke是调用的意思

获取Class类的实例(4种方式)

1.通过运行时类本身的.class属性

java反射之基础知识点_第3张图片

2.通过运行时类的一个实例(对象)来获取(使用getClass方法)

java反射之基础知识点_第4张图片

3.通过Class的静态方法forName()获取(常用

java反射之基础知识点_第5张图片

第三种方式由于该类路径下可能没有目标对应的类,所以需要抛出ClassNotFoundException异常
这个方法体现了反射的动态性。

4.使用类加载器来创建

java反射之基础知识点_第6张图片


类的加载过程:

当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。

java反射之基础知识点_第7张图片


java反射之基础知识点_第8张图片


类加载器(ClassLoader)是用来把类(class)装载进内存的JVM 规范定义了两种类型的类加载器:启动类加载(bootstrap)和用户自定义加载(user-definedclass loader)JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,如下图所示:

java反射之基础知识点_第9张图片

三个加载器由下至上依次继承。

你可能感兴趣的:(java基础)