乐趣区

关于java:类的加载与反射机制

什么是类的加载

类的加载指的是将类的.class 文件中的二进制数据读入到内存中,将其放在运行时数据区的办法区内,而后在堆区创立一个 java.lang.Class 对象,用来封装类在办法区内的数据结构。

类的加载过程:

1)装载(Load):查找并加载类的二进制数据

在加载阶段,虚拟机须要实现以下三件事件:

(1)通过一个类的全限定名来获取其定义的二进制字节流。
(2)将这个字节流所代表的动态存储构造转化为办法区的运行时数据结构。
(3)在 Java 堆中生成一个代表这个类的 java.lang.Class 对象,作为对办法区中这些数据的拜访入口。

2)链接(Link)

(1)验证:确保被加载的类的正确性;

①作用:目标是确保 Class 文件的字节流中蕴含的信息合乎以后虚拟机的要求,并且不会危害虚拟机本身的平安。

②验证阶段大抵的测验动作:

文件格式验证:验证字节流是否合乎 Class 文件格式的标准;
元数据验证:对字节码形容的信息进行语义剖析(留神:比照 javac 编译阶段的语义剖析),以保障其形容的信息合乎 Java 语言标准的要求;
字节码验证:通过数据流和控制流剖析,确定程序语义是非法的、合乎逻辑的。
符号援用验证:确保解析动作能正确执行。

(2)筹备:为类的动态变量分配内存,并将其初始化为默认值。

筹备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在办法区 中调配。

留神:

①这时候进行内存调配的仅包含类变量(static),而不包含实例变量,实例变量会在对象实 例化时随着对象一块调配在 Java 堆中。

②这里所设置的初始值通常状况下是数据类型默认的零值(如 0、0L、null、false 等),而不是被在 Java 代码中被显式地赋予的值。

(3)解析:把类中的符号援用转换为间接援用

解析阶段是虚拟机将常量池内的符号援用替换为间接援用的过程。
解析动作次要针对类或接口、字段、类办法、接口办法、办法类型、办法句柄和调用限定符 7 类符号援用进行。

符号援用:以一组符号来形容所援用的指标,符号能够是任何模式的字面量,与 VM 实现的内存布局无关,援用的指标并不一定曾经加载到内存中。

间接援用:就是间接指向指标的指针、绝对偏移量或一个间接定位到指标的句柄。

3)初始化(Initialize):对类的动态变量,动态代码块执行初始化操作

初始化,为类的动态变量赋予正确的初始值,JVM 负责对类进行初始化,次要对类变量进行初始化。

对类变量进行初始值设定:

①申明类变量是指定初始值。
②应用动态代码块为类变量指定初始值。

JVM 初始化步骤:

(1)如果这个类还没有被加载和连贯,则程序先加载并连贯该类;
(2)如果该类的间接父类还没有被初始化,则先初始化其间接父类;
(3)如果类中有初始化语句,则零碎顺次执行这些初始化语句;

反射机制:

JAVA 反射机制是在运行状态中,对于任意一个类,都可能晓得这个类的所有属性和办法;对于任意一个对象,都可能调用它的任意一个办法和属性;这种动静获取的信息以及动静调用对象的办法的性能称为 java 语言的反射机制。

反射机制的常见作用:

1)动静的加载类、动静的获取类的信息 (属性,办法,结构器).

(1)获取类的名字:

①String getName() 取得包名 + 类名.
②String getSimpleName() 取得类的名字.

(2)取得类的属性

①Field getField(String fieldName) 失去公共的属性对象.
②Field getDeclareField(String fieldName) 失去指定名称的属性对象.
③Field []c.getDeclaredFields() 失去所有的属性对象.

(3)取得类的办法

①Method[] getDeclaredMethods() 失去公共的办法对象.
②Method[] c.getMethods() 失去父类及本类中的公共的办法对象.
③Method getDeclaredMethod(StringmethodName, Class …type) 失去指定名称的本类中公共的办法.
④Method getMethod(String methodName,Class type) 失去本类或父类中的公共的办法对象.

(4)取得构造方法:

①Constructor[] getDeclaredConstructors() 失去公共的构造方法的对象.
②Constructor [] getConstructors() 失去公共的构造方法对象.
③Constructor getDeclaredConstructor(Class…type) 失去指定参数的公共的构造方法对象.

2)动静结构对象.

3)动静调用类和对象的任意办法、结构器.

4)动静调用和解决属性.

5)获取泛型信息.

6)解决注解.

常见的内容注解:

1.@Override : 标识办法是重写的办法
2.@Deprecated : 标识的办法不倡议应用
3.@SuppressWarnings:用来克制编译时的正告信息

退出移动版