注解及自定义注解

本文介绍了Java5以来的元数据支持及Annotation(注解)的使用,涵盖了@Override、@Deprecated、@SuppressWarnings等常见注解,元注解如@Retention和@Target,以及如何自定义注解。讨论了注解在文档生成、代码依赖性和编译检查中的应用,并通过实例展示了注解在实际项目中的运用。
摘要由CSDN通过智能技术生成

1. 注解支持

Java5开始 Java支持对元数据的支持, 就是是Annotation(注解)

元数据: metadata描述数据的数据
注解:标签 Annotation
所有的Annotation都是java.Lang.annotation.Annotation接口的子接口
所有Annotation是一种特殊的接口

回顾注解:
@Override -->重写
@Deprecated --> 过时的
@SuppressWarings --> 压制警告

既可以放在方法上,放在变量上,放在类或接口上

使用注解需要注意:必须有三个参与才有意义

1.有注解的本身

2.被放置的位置(类,属性,方法,接口,参数上,包等等)

3.由第三方程序使用反射的手段赋予注解特殊的功能

Java5之前自带注解

2. 常用注解

Java5中提供的

@Override --> 限定子类重写父类的方法,只能在方法上
@Deprecated --> 标记当前方法已经过时,不推荐使用 只能用在方法上
@SuppressWarings --> 抑制编译器发出多种警告
@SuppressWarings(value=“all”) 可以应用在方法,类,属性上

Java7中提供了一个

@SafeVarargs–>抑制堆污染
​当方法使用可变参数和泛型参数,此时就会造成堆污染 Arrays.asList

Java8中提供一个
@FunctionalInterFace 函数式编程 -->所用在接口上

3. 元注解

描述注解的注解,用来限定注解可以贴在哪些程序元素上,还可以指定注解存在的周期

@Retention: 表示注解可以保存在哪一个代码时期. 保存的时期的值,封装在RetentionPolicy枚举类中:

注意:一般的,自定义的注解,使用RUNTIME.(使用反射赋予注解功能)

SOUECE:注解只能存在于源文件中,一旦编译,在字节码中就消失了.

CLASS:(缺省),注解可以存在于源文件和字节码文件中,一旦加载进JVM,在JVM中就消失了.

RUNTIME:注解可以存在于源文件,字节码文件,JVM中.

@Target:表示注解可以贴在哪些位置(类,方法上,构造器上等等).

位置的常量封装在ElementType枚举类中:

ElementType.ANNOTATION_TYPE只能修饰Annotation

ElementType.CONSTRUCTOR只能修饰构造方法

ElementType.FIELD只能修饰字段(属性),包括枚举常量

ElementType.LOCAL_VARIABLE只能修饰局部变量

ElementType.METHOD只能修饰方法

ElementType.PACKAGE只能修饰包(极少使用)

ElementType.PARAMETER只能修饰参数

ElementType.TYPE只能修饰类,接口,枚举

4. 实现自己的注解

4.1 语法格式

@interface

@Retention(设置注解存储在的时间)

@Target(设置可以书写注解的位置)

public @interface 注解名{
​ 注解中的成员:
​ 抽象方法 --> (属性)
​ 数据类型 方法名() default 默认值;

}

使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

4.2 定义注解格式

public @interface 注解名 {定义体}

注解参数的可支持数据类型:

  • 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  • String类型
  • Class类型
  • enum类型
  • Annotation类型
  • 以上所有类型的数组

参数定义要点

  • 只能用public或默认(default)这两个访问权修饰;
  • 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型String,Enum,Class,annotations等数据类型,以及这一些类型的数组;
  • 如果只有一个参数成员,建议参数名称设为value();
  • 注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或负数作为默认值是一种常用的做法。

ps:Spring框架中–> 注解最多 --> 动态代理模式 --> 内省模式JavaBean和Map互转

实例:

自定义用于方法的注解
package com.qf.test;
import java.lang.annotation.*;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface testInter11 {
	String value () default "abc";
}
自定义用于类上的注解
package com.qf.test;
import java.lang.annotation.*;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface testInter12 {
	String value1 () default "abc";
}
自定义注解的使用测试
package com.qf.test;

import java.lang.reflect.Method;

@testInter12(value1="ok")
public class Annotation1 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		//获取类的字节码文件对象
		Class<?> class1 = Class.forName("com.qf.test.Annotation1");
		//获取方法的字节码文件对象
		Method method = class1.getMethod("excute");
		//判断后面的注解是否在当前的类上
		if (class1.isAnnotationPresent(testInter12.class)) {
		//获取注解
			testInter12 a1 = (testInter12) class1.getAnnotation(testInter12.class);
			System.out.println("类上的value:"+a1.value1());
		}
		//判断后面的注解是否在当前的方法上
		if (method.isAnnotationPresent(testInter11.class)) {
			testInter11 t1 = method.getAnnotation(testInter11.class);
			System.out.println("方法上的注解:"+t1.value());
		}
	}
	//这里可以加(),也可以不加
	@testInter11()
	public   void excute() {
		System.out.println("haha");
	}
}

4.3 注解的作用

java 注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:

1.生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;

2.跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;

3.在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;

4.自定义注解:可以应用到反射中,如实现实体类某些属性不自动赋值,或者验证某个对象属性完整性等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小大数据

你的打赏是我活下去的动力哟~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值