1类加载

  • 类加载过程
    • 加载:获得二进制字节流,生成Class对象
    • 连接
      • 验证:确保加载类的正确性(正确性校验)
      • 准备:为静态成员分配内存空间,并设置默认值
      • 解析:将类中的符号引用替换为直接引用(指针指向真实地址)
    • 初始化:给静态成员变量赋值,执行静态代码块内容
  • 类加载器
    • 根类加载器(BootStrap ClassLoader):JDK 的 JRE lib\rt.jar 文件(rt指的是runtime)
    • 扩展加载器(Extension ClassLoader):JDK 的 JRE lib\ext.jar 文件
    • 系统/应用类加载器(System/APP ClasssLoader):加载自己写的类classpath,在out相应目录下
    • 自定义类加载器( User ClassLoader): 用户可以自定义类加载器,继承APP类加载器
    • 继承关系 BootStrap <— Extension <— System/APP <— User
  • 双亲委派模型
    • 避免重复类加载,避免核心类被篡改
    • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
    • 保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
  • 类加载时机(6个)
    • 首次创建类的实例,new关键字
    • 首次访问类的静态变量
    • 首次访问类的静态方法
    • 加载某个类的子类会触发父类的类加载
    • 使用反射强制创建类或者接口的对象
    • 使用java.exe运行某个主类,执行main方法
  • Java代码的三个阶段
    • Resource
    • Class
    • Runtime

2反射

  • 反射的基础:获取运行时类的信息
  • 获取字节码文件对象的方式
    • Class.forName(“全限定类名”) 完整的类加载
    • 类名.class ,并不是完整的类加载,静态代码块中没输出
    • 对象名.getclass() 已经创建对象了
    • 这个暂时我也不知道怎么用
  • 配置文件(.properties)
    • 数据库的配置信息
      • driver
      • username
      • password
      • url
    • 第三方服务的信息
    • 导入mysql-connection-java.jar 数据库驱动后,手动把第三方类库加入classpath里面 add as library,由APP ClassLoader完成类加载
  • API
    • 获取构造方法(Constructor)
      • getConstructors() 获取public构造方法
      • getDeclaredConstructors() 获取所有构造方法
      • getConstructor(Class…parameterType) 获取指定public构造方法,例如,getConstructor(String.class , int.class)
      • getDeclaredConstructor(Class…parameterType) 获取所有构造方法
    • 通过构造方法实例化对象
      • newInstance(Object…initargs) ,例如,constructor.newInstance(“张三” , 12)
      • 暴力通过私有的构造方法实例化对象 setAccessible(true),无视语法检查
    • 获取成员变量(Field)
      • 参考获取构造方法
    • 获取成员变量的值
      • get(Object obj),获取指定对象的成员变量的值,例如,fieldName.get(getConstructor().newInstance())
      • set(Object obj , Object value),给指定对象的成员变量赋值
    • 获取成员方法(Method)
      • 参考获取构造方法
    • 调用成员方法
      • invoke(Object obj , Object parameterType) 通过实例化对象调用含参方法
  • 应用场景
    • ORM框架:Object Relational Mapping 对象关系映射,框架的底层原理就是反射

3注解

  • 模板数据类型
    • 类 class
    • 接口 interface
    • 注解 @interface
    • 枚举 enum
  • 注释与注解
    • 注释:传达信息,供程序员查阅,不参与编译
    • 注解:传达信息,给编译器使用,但是不改变原有代码逻辑
  • 自定义注解

    1. 权限修饰符 @interface 注解名{
    2. //注解体
    3. 属性类型 属性名();
    4. 属性类型 属性名();
    5. }
    • 属性类型
      • 基本数据类型及数组
      • String类型及数组
      • 枚举类型及数组
      • Class类型及数组
      • 注解类型及数组
  • 注解的使用(重点)

    • 注解的实例化

      1. @注解名(给注解的所有属性赋值)
      2. @interface AgeAno {
      3. int minAge();
      4. int maxAge();
      5. }
      6. class Stu {
      7. @AgeAno(minAge=18,maxAge=60)
      8. public int age;
      9. }
    • 如果注解属性只有一个且名称为value,可以简化赋值

  • 注解处理器
    • 先获取注解信息,然后根据注解信息做出相应处理的程序或者代码
  • 元注解(重点):描述注解的注解
    • 元数据 meta data
    • @Retention:注解的保留级别
      • SOURCE
      • CLASS
      • RUNTIME
    • @Target:作用目标
      • TYPE
      • FIELD
      • METHOD
      • CONSTRUCTOR
  • 注解与配置文件