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) 通过实例化对象调用含参方法
- 获取构造方法(Constructor)
- 应用场景
- ORM框架:Object Relational Mapping 对象关系映射,框架的底层原理就是反射
3注解
- 模板数据类型
- 类 class
- 接口 interface
- 注解 @interface
- 枚举 enum
- 注释与注解
- 注释:传达信息,供程序员查阅,不参与编译
- 注解:传达信息,给编译器使用,但是不改变原有代码逻辑
自定义注解
权限修饰符 @interface 注解名{
//注解体
属性类型 属性名();
属性类型 属性名();
}
- 属性类型
- 基本数据类型及数组
- String类型及数组
- 枚举类型及数组
- Class类型及数组
- 注解类型及数组
注解的使用(重点)
注解的实例化
@注解名(给注解的所有属性赋值)
@interface AgeAno {
int minAge();
int maxAge();
}
class Stu {
@AgeAno(minAge=18,maxAge=60)
public int age;
}
如果注解属性只有一个且名称为value,可以简化赋值
- 注解处理器
- 先获取注解信息,然后根据注解信息做出相应处理的程序或者代码
- 元注解(重点):描述注解的注解
- 元数据 meta data
- @Retention:注解的保留级别
- SOURCE
- CLASS
- RUNTIME
- @Target:作用目标
- TYPE
- FIELD
- METHOD
- CONSTRUCTOR
- 注解与配置文件