目录

枚举

枚举介绍

枚举定义格式

枚举的使用场景

类加载器

类加载器介绍​编辑​编辑

类加载器的加载过程

类加载器的分类

双亲委派模式

反射

反射介绍

获取类的字节码对象

反射类中的构造方法

Constructor类用于创建对象的方法

反射类中的成员变量

Field类的设置和获取方法

反射建议

反射类中的成员方法

注解

自定义注解

自定义注解格式

自定义注解使用

特殊的属性 value

元注解

动态代理


枚举

枚举介绍

枚举是 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类用于创建对象的方法

方法

功能

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() 方法创建代理对象

参数一:用于指定用哪个类加载器,去加载生成的实现类
参数二:指定接口,这些接口用于指定生成的实现类中有什么,也就是有哪些方法
参数三:用来指定生成的实现类中不同方法的实现方案

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐