一、类的加载
A、加载
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时都会建立一个Class对象。
B、连接
验证 是否有正确的内部结构,并和其他类协调一直
准备 负责为类的静态成员分布内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
C、初始化
之前讲过
二、类加载器
负责将.class文件加载到内存中,并为之生成对应的Class对象;
组成:
Bootstrap ClassLoader 根类加载器:也叫引导加载器,负责核心类的加载
Extension ClassLoader 扩展类加载器:负责扩展目录中jar包的加载
System ClassLoader 系统类加载器 :负责在JVM启动市加载来自java命令的class文件,以及 classpath环境变量
三、反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。
简单来说就是通过class文件对象去使用该文件中的成员变量,构造方法,成员方法;
Class类:
成员变量:Field 构造方法:Constructor 成员方法:Method
获取Class文件方式:
A:Object类的getClass()方法
B:数据类型的静态属性class
C:Class类中的静态方法
public static Class forName(String classname);全路径
开发一般使用C方法(灵活,可变化);
获取构造方法:
public Constructor[] getDeclaredConstructors()返回所有构造方法;
public Constructor getConstructor(Class(?)...parameterTypes)返回单个构造方法;参数是你要获取的参数个数和class对象
构造方法对象.newInstance()创建对象; 构造方法对象.setAccessible(boolean)设置访问;
获取成员变量:
getFields(),getDeclaredFields();getField();getDeclaredField()前两个得到多个,后两者得到单个
Field对象.set(Object obj,Object value)给obj的Field属性设置为value值;
获取成员方法:与上述类似
getMethods()获取自己和父类所有公共方法 getDeclaredMethods()获取自己所有方法
Methods对象.invoke(对象 参数)