Java基础2.7Java高级技术
目录
枚举
枚举介绍
枚举是 Java 中的一种特殊类型,一般用来做信息的标记和分类
使用标记来区分春、夏、秋、冬四个季节



枚举定义格式

每一个枚举项其实就是该枚举的一个对象
通过枚举类名去访问指定的枚举项
所有枚举类都是 Enum 的子类
枚举也是类, 可以定义成员变量
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的
但是如果枚举类有其他的东西,这个分号就不能省略 (建议不要省略)
枚举类可以有构造器,但必须是 private 的,它默认也是 private
枚举类也可以有抽象方法,但是枚举项必须重写该方法
枚举的使用场景

类加载器
类加载器介绍




类加载器的加载过程




类加载器负责将类的字节码载入到方法区中
加载时机:用到就加载
加载过程:加载 – 链接(验证、准备、解析) – 初始化
类加载器的分类
Bootstrap class loader:启动类加载器,虚拟机的内置类加载器,通常表示为null
C++ 实现, 获取到的只能是 null
Platform class loader:平台类加载器,负责加载 JDK中一些特殊的模块
负责加载 lib\modules 内部的类
JDK9 之前是:(Extension Class Loader) 扩展类加载器
负责加载 jre\lib\ext 目录下的类
Application class loader:应用程序类加载器
负责加载自己写的类
自定义类加载器: 上级为 Application
目前不做讲解
| 方法 | 功能 |
| public Classloader getClassLoader() | 获取该类的, 类加载器对象. |
如果一个类加载器收到了类加载请求,它并不会自己先去加载
而是把这个请求委托给父类的加载器去执行
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归
请求最终将到达顶层的启动类加载器
如果父类加载器可以完成类加载任务,就成功返回
倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
双亲委派模式

如果一个类加载器收到了类加载请求,它并不会自己先去加载
而是把这个请求委托给父类的加载器去执行
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归
请求最终将到达顶层的启动类加载器
如果父类加载器可以完成类加载任务,就成功返回
倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式
避免类的重复加载
反射
反射介绍
框架技术的灵魂
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用它的任意属性和方法
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制

获取类的字节码对象
Class.forName("全类名");
类名.class
对象.getClass();
反射是框架技术的灵魂
在运行状态中,可以操作到任意类中的任意属性任意方法
反射操作的是字节码对象
获取字节码对象的三种方式
Class.forName(全类名)
类名.class
对象名.getClass();
反射类中的构造方法
| 方法 | 功能 |
| Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
| Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
| Constructor<T> getConstructor(Class<?>... parameterTypes) | 返回单个公共构造方法对象 |
| Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 |
Constructor类用于创建对象的方法
| 方法 | 功能 |
| T newInstance(Object...initargs) | 根据指定的构造方法创建对象 |
| setAccessible(boolean flag) | 设置为true,表示取消访问检查 |
反射类中的成员变量
| 方法 | 功能 |
| Field[] getFields() | 返回所有公共成员变量对象的数组 |
| Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
| Field getField(String name) | 返回单个公共成员变量对象 |
| Field getDeclaredField(String name) | 返回单个成员变量对象 |
Field类的设置和获取方法

反射建议
禁止暴力反射操作
反射类中的成员方法

注解


自定义注解
自定义注解单独存在意义不大,一般会跟反射结合起来使用
自定义注解格式


自定义注解使用

特殊的属性 value
如果只有一个属性名字为value没有赋值,使用时直接给出值,不需要写属性名
@SuppressWarnings("all"):压制警告
元注解

动态代理
动态代理是对象的另外一种创建方式,这种方式可以在不修改源码的情况下,增强方法



动态代理是对象的另外一种创建方式,这种方式可以在不修改源码的情况下,增强方法
代理对象可以在原有功能的基础上进行增强
动态代理在运行时动态的生成代理类,无需手动为每个目标类编写代理类
使用 Proxy 中的 newProxyInstance() 方法创建代理对象
参数一:用于指定用哪个类加载器,去加载生成的实现类
参数二:指定接口,这些接口用于指定生成的实现类中有什么,也就是有哪些方法
参数三:用来指定生成的实现类中不同方法的实现方案
更多推荐



所有评论(0)