类加载器
作用:
将硬盘的class字节码文件送到虚拟机里面运行
过程:
加载、验证、 准备、解析、初始化 其中中间三步叫做链接
加载:1、通过包名+类名得到这个类,通过流进行传输 2、到内存 3、创建class对象
加载时机:什么时候用就加载,不用就不加载—使用情况:
1、创建类的实例 2、调用类的方法 3、使用静态变量 4、反射创建对象 5、创建类的子类的 6、运行主类的时候
验证:代码是否安全
准备:给静态变量默认的值
解析:如果用到了其他的类,会用符号表示,使用这一步是将这些符号转换为使用到的类
初始化:给静态变量赋值,初始化其他资源
类加载器种类
启动类:Bootstrap ClassLoader :虚拟机内置的类加载器
平台类:platfrom ClassLoader :加载JDK一些特殊的方法
系统类:System ClassLoader :加载用户类路径上指定的类库
自定义类:User ClassLoader
双亲委派模型
从下到上 逻辑继承
当一个加载器需要加载一个字节码文件时,他会先请求委托给他的父类加载器,到最顶层启动类加载器时,如果字节码文件超过了自己的加载范围就会向下返回。
常用方法:
ClassLoader有一个方法 getSystemClassLoader()----得到SystemClassLoader 对象
然后可以使用getParent()方法得到上一层的加载类对象
systemClassLoader.getResourceAsStream(“路径名”)----利用加载器去加载一个文件得到io流
一般用于加载配置文件
反射
动态获取一个类的成员方法、成员变量、构造方法
1、首先得到class文件对象
a、类名.class() b、对象名.getClass c、Class.forName(“src路径下的文件路径”)—常用
2、得到构造方法对象
用class文件对象调用 参数都是类似。。int.class----String.class
a、getConstructor()-----获得单个public构造方法----参数可以写对应的参数获得不同的构造方法对象
b、getConstructors()----获得所有的public构造方法,返回的是一个数组
c、getDeclaredConstructor()—获得任意一个构造方法—参数匹配
d、getDeclaredConstructor()----获得所有的构造方法–返回的是一个数组
3、获取成员方法对象
class文件对象调用
a、getField(“name”)----得到指定名称的成员变量对象 public
b、getFields()----得到所有public 修饰的成员变量 返回的是一个数组
c、getDeclaredField(“name”)—得到指定名称的成员变量对象
d、getDeclaredFields()----得到所有的成员变量对象—返回的是一个数组
给成员变量赋值、获取成员变量值
用Field对象调用
set(类对象,值)
get(类对象)
4、获取成员方法对象
用class文件对象调用 参数都是类似。。int.class----String.class
a、gerMethod(“方法名”,参数类型)—得到public修饰的参数对应指定方法对象
b、getMethods()—得到的是所有的被public修饰的成员方法对象 返回的是数组
c、getDeclaredMethod(“f方法名”,参数类型)----获得自动名称切参数对应的指定方法对象
d、getDeclaredMethods()–获得所有的方法-返回的是一个数组
成员方法的使用
Method.invoke(参数1,参数2)
注意
所有的被private修饰的成员方法、成员变量、构造方法对象再被使用是 需要进行暴露反射进行取消检测 然后使用
对象名.setAccessibld(true)