注解与反射

java.lang.annotation包

内置注解

@Autowired。。。。

org.springframework.boot.autoconfigure.condition

@ConditionalOnProperty

控制某个configuration是否生效。

@ConditionalOnProperty(
      prefix = "matchIfMissing ",
      name = "type",
      havingValue = "name",
      matchIfMissing = true)
  • name
    用来从application.properties中读取某个属性值,
  1. 如果该值为空,则返回false
  2. 如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
  3. 如果返回值为false,则该configuration不生效;为true则生效
  • matchIfMissing
  1. 用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。
  2. 如果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包的方法对类进行反射调用
  • 被动引用(不会发生类的初始化)

创建运行时类的完整结构

调用运行时类的指定结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值