类加载过程
概念
- 将class文件从磁盘加载到内存中,并获取class文件中的数据,对这些数据进行解析,转换等操作,最终成为可使用的java类型,此过程称为---类加载过程
过程
- 加载、连接、初始化、使用、卸载
加载
- 将class文件从磁盘内存中,为当前这个class文件自动创建一个Class对象
连接
- 验证class文件中内部结构,将一些符号名称转为对应的数据
什么时候加载类
- 1.创建该类型对象
- 2.访问静态成员时
- 3.获取Class对象时
- 4.创建子类对象时,父类class文件
- 5.执行java.exe命令
- ...
类加载器
概念
- 类加载器是一个对象,作用:用来加载class文件,从磁盘到内存,并为该class文件,创建一个Class对象
分类
-
Bootstrap ClassLoader
- 引导类加载器 父
-
Extension ClassLoader
- 扩展类加载器 子
-
Application ClassLoader
- 系统类加载器 子子
-
自定义类加载器,定义类继承ClassLoader
加载类时,采用一种委托机制
- 加载类时,会逐级向上委托(App-->ext-->boot,此时不会搜索该类是否存在),boot没有父类,此时boot会查找它的包含范围中是否有该class,如果有就加载,如果没有找ext,ext会查找它的包含范围中是否有该class,如果有就加载,如果没有找app,查找它的包含范围中是否有该class,如果有就加载,如果没有抛出异常,ClassNotFoundException。
反射技术
步骤
- 1、获取Class对象,该Class对象代表这个一个class文件
- 2、获取Class的对象表示的class文件中的内容,并对这些内容进行想要的操作
反射技术的源头
- Class对象
获取Class对象
-
1、已有对象的情况下
- getClass()
-
2、已知全类名的情况下
- 类型名.class
-
3、已知全类名的情况下
- Class.forName("包名.类名")
Class类
-
java.lang包中的对象
- Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
-
Class类中的方法
-
newInstance()
- 创建此Class对象所表示的类的一个新实例
-
创建对象时,要保证对象类中需要有无参数构造方法,因为创建对象调用的是该方法
-
Class的对象表示一个运行时的类,那么类中有成员(属性、方法、构造方法...)可以进行获取和操作。java是面向对象思想,因此属性、方法、构造方法也能封装成对应的类形式,即对象形式,属性(字段)--->Field ,方法--->Method, 构造方法--->Constructor。
-
Constructor类
-
newInstance(Object... initargs)
- 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
-
getName()
- 获取方法名
-
Modifier.toString(c.getModifiers());
- 获取修饰符
-
获取构造方法们
-
Constructor<?>[] getConstructors()
- 获取所有公共构造方法
-
Constructor getConstructor(类<?>……parameterTypes)
- 获取某个公共构造方法
-
Constructor getDeclaredConstructor(类<?>……parameterTypes)
- 获取某个构造方法,不考虑修饰符
-
Constructor<?>[] getDeclaredConstructors()
- 获取所有构造方法,不考虑修饰符
-
Field,字段类,即类中属性
-
获取成员变量们
-
Field[] getfields()
- 获取所有公共成员变量
-
Field getField(String name)
- 获取某个公共成员变量
-
Field[] getDeclaredFields()
- 获取所有成员变量,不考虑修饰符
-
Field getClareField(String name)
- 获取某个成员变量,不考虑修饰符
-
-
设置属性值
-
set(Object obj,Object value)
- 将指定对象变量上此Field对象表示的字段设置为指定的新值
-
get(Object obj)
- 返回指定对象上此Field表示的字段值
-
-
getType()
- 返回类型
Method类,用于封装方法的对象类
-
获取成员方法们
-
Method[] getMethods()
- 获取所有的公共方法,包括父类的
-
Mehtod getMethod(String name, 类<?>……parameterTypes)
- 获取某个公共方法
-
Method[] getDeclaredMethods()
- 获取所有方法,包括当前类
-
Mehtod getDeclaredMethod(String name, 类<?>……parameterTypes)
- 获取某个方法,不考虑修饰符
-
-
invoke(Object obj,Object… args)
- 对带有指定参数的指定对象调用由此Method对象表示的底层方法
-
getReturnType();
- 获取返回值类型
-
getExceptionTypes()
- 获取异常类型
setAccessible(true);
- 暴力反射,不受权限修饰符限制