反射知识点总结

1. 什么是反射?

答:在程序运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

2. java有多少个类加载器?分别的作用是什么?一个.class文件是怎么被加载到JVM里的,描述一下加载流程。

答:java有三个类加载器,分别为:根类加载器,扩展类加载器,系统类加载器。

根类加载器负责java核心类的加载,扩展类加载器负责扩展jar包的加载;系统类加载器负责自定义类的加载。

类加载的全过程包括加载、验证、准备、解析和初始化5个阶段。其中,验证、准备、解析三个部分统称为连接。

加载阶段。虚拟机利用类加载器将Class文件加载到内存中,准确的讲,是加载到内存中的方法区,并为这个Class文件生成一个Class文件对象(类的字节码对象),作为方法区中这个Class文件的访问入口。(注意,Class文件存放在方法区,但是Class文件对象并不一定存放在堆中,还可能在方法区中)

验证阶段。这一阶段的目的是为了确保Class文件的中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

准备阶段。这一阶段是正式在方法区内为类的静态变量分配内存,并设置初始值。这里有两个特别容易混淆的概念需要强调一下。首先,这个时候进行内存分配的类变量指的仅是静态变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里的初始值指的是数据类型的零值(假设有一个类的静态变量为static int value = 123,那变量value在准备阶段过后的初始值为0而不是123)。

解析阶段。这一阶段是将类文件中的符号引用替换为直接引用。

初始化阶段。执行类中定义的java代码,初始化类的静态变量和其它资源(假设有一个类的静态变量为static int value = 123,准备阶段过后,value初始值为0,而初始化阶段,就是执行java代码,将123赋给valuevalue的初始值为123)。

3. 类加载的时机?(什么情况下会将类文件加载到内存中?)

答:创建类的实例

调用类中的静态变量和静态方法。

初始化类的子类

对类进行反射调用的时候

虚拟机启动时,会初始化包含main()函数的那个类

猜你喜欢

转载自blog.csdn.net/lz1170063911/article/details/80261893