一、类加载器
1.作用:
负责将.class文件(存储的物理文件)加载到内存中
2.类加载时机:
- 创建类的实例
- 调用类的类方法
- 访问类或者接口的类变量,或者为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
3.类加载过程
加载、链接、准备、解析、初始化
4.类加载的分类
Bootstrap class loader: | 虚拟机的内置类加载器,通常表示为null ,并且没有父null |
Platform class loader: | 平台类加载器,负责加载JDK中一些特殊的模块 |
System class loader | 系统类加载器,负责加载用户类路径上所指定的类库 |
类加载器的继承关系
-
System的父加载器为Platform
-
Platform的父加载器为Bootstrap
5.双亲委派模型
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
6.ClassLoader 中的两个方法
public static ClassLoader getSystemClassLoader() :获取系统类加载器
public InputStream getResourceAsStream(String name):加载某一个资源文件
二、反射
1.反射概念
反射 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法。
2.获取Class类对象的三种方式
三种方式分类
类名.class属性
对象名.getClass()方法
Class.forName(全类名) ----->最常用
3.反射获取构造方法(Constructor类)
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>... parameterTypes) | 返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 |
Constructor类用于创建对象的方法
T newInstance(Object...initargs) :根据指定的构造方法创建对象
(如果是public的,直接创建对象 newInstance(Object... initargs) )
setAccessible(boolean flag) : 设置为true,表示取消访问检查 --->暴力反射setAccessible(boolean) .操作属性完成后将权限关闭。 .setAccessible(false)
(如果是非public的,需要临时取消检查,然后再创建对象 )
4.反射获取成员变量
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
Field类用于给成员变量赋值的方法
void set(Object obj, Object value) | 赋值 |
Object get(Object obj) | 获取值 |
5.反射获取成员方法
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>... parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 返回单个成员方法对象 |
Method类用于执行方法的方法
Object invoke(Object obj, Object... args) : 运行方法
参数一: 用obj对象调用该方法
参数二: 调用方法的传递的参数(如果没有就不写)
返回值: 方法的返回值(如果没有就不写)
三、枚举
1.概念
为了间接的表示一些固定的值,Java就给我们提供了枚举 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内
2.格式
public enum s {
枚举项1,枚举项2,枚举项3;
}
注意: 定义枚举类要用关键字enum
3.枚举的特点
-
所有枚举类都是Enum的子类
-
我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
-
每一个枚举项其实就是该枚举的一个对象
-
枚举也是一个类,也可以去定义成员变量
-
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
-
枚举类可以有构造器,但必须是private的,它默认的也是private的。
枚举项的用法比较特殊:枚举("");
-
枚举类也可以有抽象方法,但是枚举项必须重写该方法
4.枚举的方法
-
String name() 获取枚举项的名称 int ordinal() 返回枚举项在枚举类中的索引值 int compareTo(E o) 比较两个枚举项,返回的是索引值的差值 String toString() 返回枚举常量的名称 static <T> T valueOf(Class<T> type,String name) 获取指定枚举类中的指定名称的枚举值 values() 获得所有的枚举项