Java_注解

1.注解

1.1 概述

annotation,是一种代码级别的说明,和类 接口平级关系.

注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上定义

1.2注解的作用

执行编译期的检查 例如:@Override

分析代码(主要用途:替代配置文件); 用在框架里面, 注解开发

1.3 JDK提供的三个基本的注解

@Override:描述方法的重写.

@SuppressWarnings:压制警告.

@Deprecated:标记过时

2.自定义注解

2.1 注解格式

定义一个类:class

定义一个接口:interface

定义一个枚举:enum

定义一个注解:@interface

本质上就是一个接口,接口中可以定义变量(常量)和方法(抽象),注解中的方法叫注解属性

语法:  @interface 注解名{}
/**
 * 定义了注解
 *
 */
public @interface Annotation01 {

}

2.2 注解属性

  • 属性类型

    1.基本类型
    在这里插入图片描述
    2.String

    3.枚举类型

    4.注解类型

    5.Class类型

    6.以上类型的一维数组类型

一旦注解有属性了,使用注解的时候,属性必须有值


/**
 *注解的属性; 格式和接口的方法很类似 
 *	1.基本类型
	2.String
	3.枚举类型
	4.注解类型
	5.Class类型  
	6.以上类型的一维数组类型  

 */
public @interface Annotation02 {
	int a();//基本类型
	
	String b();//String
	
	Color c();//枚举类型
	
	Annotation01 d();//注解类型
	
	Class e();//Class类型  
	
	String[] f();//一维数组类型 
	
}
  • 注解属性赋值

格式

@注解名(属性名=,属性名2=2)  

eg:@MyAnnotation3(i = 0,s="1")
  • 注意

若属性类型的一维数组的时候,当数组的值只有一个的时候可以有以下下两种写法

@MyAnnotation4(ss = { "a" })
@MyAnnotation4(ss = "a")

若属性名为value的时候,且只有这一个属性需要赋值的时候可以省略value

@MyAnnotation5(value = "a")
==>@MyAnnotation5( "a")

注解属性可以有默认值

属性类型 属性名() default 默认值;

3.元注解

3.1 概述

定义在注解上的注解

3.2 类型

在这里插入图片描述

@Target:定义该注解作用在什么上面(位置),默认注解可以在任何位置. 值为:ElementType的枚举值

	METHOD:方法

	TYPE:类 接口

	FIELD:字段

	CONSTRUCTOR:构造方法声明

@Retention:定义该注解保留到那个代码阶段, 默认只在源码阶段保留 值为:RetentionPolicy类型

	SOURCE:只在源码上保留(默认)

	CLASS:在源码和字节码上保留

	RUNTIME:在所有的阶段都保留 

.java (源码阶段) ----编译—> .class(字节码阶段) ----加载内存–> 运行(RUNTIME)

4.注解解析

java.lang.reflect.AnnotatedElement

  • T getAnnotation(ClassannotationType):得到指定类型的注解引用。没有返回null。

  • boolean isAnnotationPresent(Class<?extends Annotation> annotationType):判断指定的注解有没有。
    Class、Method、Field、Constructor等实现了AnnotatedElement接口.

  • Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。

  • Annotation[] getDeclaredAnnotations():得到自己身上的注解。

public @interface Annotation01 {
}

@Annotation01
class Demo01{
  
  @Annotation01
  public void fun01(){
    
  }
  
}

//解析注解
//1. 获得Demo01字节码
Class clazz =  Demo01.class;
//2. 获得注解的引用(对象), 有就返回引用, 没有就返回null
Annotation01 annotation01 = clazz.getAnnotation(Annotation01.class);
//3. 反射获得fun01()方法对象
Method method =  clazz.getMethod("fun01");
//4. 判断当前的方法上面是否有Annotation01注解; 如果有就返回true, 没有就返回false
boolean flag =  method.isAnnotationPresent(Annotation01.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值