java.lang.annotation包
内置注解
@Autowired。。。。
org.springframework.boot.autoconfigure.condition
@ConditionalOnProperty
控制某个configuration是否生效。
@ConditionalOnProperty(
prefix = "matchIfMissing ",
name = "type",
havingValue = "name",
matchIfMissing = true)
- name
用来从application.properties中读取某个属性值,
- 如果该值为空,则返回false
- 如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
- 如果返回值为false,则该configuration不生效;为true则生效
- matchIfMissing
- 用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。
- 如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效
源注解
@Target
描述注解的使用范围。
- method
- type(类上)
@Retention
需要在什么级别保存该注解信息,用于描述注解的生命周期。(注解用在什么地方有效)
- source(只源码级别有效) <class(编译级别仍有效)<runtime(所有都有效)
@Inherited
子类可继承父类的的该注解
@Document
说明该注解被包含在javadoc中
自定义注解
public @ interface 注解内容{定义内容}
- 一个属性建议使用value,使用时value可省略。
@MyAnnotation("haha")
反射机制(java.Reflection)
java是静态语言,因为反射机制,让java成为动态语言。
概述
动态语言
运行时可改变结构的语言。例,javaScript、Python。
静态语言
Java、C、C++
- java是准动态语言,利用反射机制获取类似动态语言的特性。
Reflection
- 正常方式
引入需要的“类”的名称->通过new实例化->取得实例化对象 - 反射方式
实例化对象->getClass()方法->得到完整的“包类”名称
获取class实例
Class c = Class.forName("java.lang.String");
- 在运行时判断对象所属于的类
- 在运行时构造任意一个类的对象
- 生成动态代理(-todo)
classLoader
Class
- 一个加载的类在JVM中只会用一个Class实例
- Class对象只能由系统建立对象
- 常用方法
person.getClass();
Class.forName("类路径");
内存分析
类的加载(Load)
- 将class字节码内容加载进内存,并将这些静态数据转换成方法区的运行时数据结构。
类的链接(Link)
- 将Java类的二进制代码合并到JVM的运行状态之中的过程。
-
- 验证:确保加载的类信息符合JVM规范,没有安全方面的问题
- 准备:正是为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
- 解析:虚拟机常量池内的符号引用(常量名)替换成直接引用(地址)的过程。
类的初始化(Initialize)
-
主动引用(一定会发生类的初始化)
- 虚拟机启动会先初始化main所在的类
- new一个类的对象
- 调用类的静态成员(除了final常量)和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
-
被动引用(不会发生类的初始化)