Java注解

 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

那么什么是注解呢?举一个简单的例子。

@Override
public String toString() {
    return "This is String Representation of current object.";
}

toString()方法使用了@Override注解。但是,即使我不使用@Override注解标记代码,程序也能够正常执行。@Override告诉编译器这个方法是一个重写方法(元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我们不小心将toString()写错了,并且没有加@Override注解标签,编译器是会报错的。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。

Aninotation遵循一个基本原则:不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。

这里提到了元数据,那么什么是元数据。

元数据:关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。

综上所述:     第一,元数据以标签的形式存在于Java代码中。     第二,元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。     第三,元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。     第四,元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。

注解的作用(优点和缺点):

编写文档:通过代码里标识的元数据生成文档。 代码分析:通过代码里标识的元数据对代码进行分析。 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

正式由于上面的特点,使我们在开发中也出现一些问题,入出现问题没办法快速定位错误,调试难度加大。但是这也不影响我们队注解的使用。

注解分类

根据注解参数的个数,我们可以将注解分为三类:

1.标记注解:一个没有成员定义的Annotation类型被称为标记注解。这种Annotation类型仅使用自身的存在与否来为我们提供信息。比如后面的系统注解@Override; 2.单值注解 3.完整注解

根据注解使用方法和用途,我们可以将Annotation分为三类: 1.JDK内置系统注解 2.元注解 3.自定义注解。

系统内置的常用的注解:

@Override:用于修饰此方法覆盖了父类的方法; @Deprecated:用于修饰已经过时的方法; @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。

注解修饰

注解也可以添加注解的“注解”去修饰,J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:

@Documented –注解是否将包含在JavaDoc中 @Retention –什么时候使用该注解 @Target? –注解用于什么地方 @Inherited – 是否允许子类继承该注解

@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。 @Retention– 定义该注解的生命周期。 RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。 RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。 RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

@Target – 表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,仅仅排除一个属性,那么你需要在定义target包含所有的属性。 ElementType.TYPE:用于描述类、接口或enum声明 ElementType.FIELD:用于描述实例变量 ElementType.METHOD ElementType.PARAMETER ElementType.CONSTRUCTOR ElementType.LOCAL_VARIABLE ElementType.ANNOTATION_TYPE 另一个注释 ElementType.PACKAGE 用于记录java文件的package信息 @Inherited – 定义该注释和子类的关系

说了这么多,我们来自己定义注解吧

注解例子

自定义注解:

/**
SOURCE : 编译程序时处理完Annotation信息后就完成任务
CLASS: 编译程序将Annotation存储于class文件中,不可以由虚拟机读入
RUNTIME: 编译程序将Annotation存储于class文件中,可以由虚拟机读入
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
	//无参数
    String value();
    //有默认值的注解
    String defaultValue() default "";
    //枚举参数
    TestEnum testenum();
}

枚举类:

public enum TestEnum {
	CANCEL {public String getName() {return "cancel";}},
	WAITE {public String getName() {return "waite";}},
	OK {public String getName() {return "ok";}},
}

测试

@TestAnnotation(value="value",defaultValue="test",testenum=TestEnum.CANCEL)
public class Test {
	public static void main(String[] args) {
		TestAnnotation annotation=Test.class.getAnnotation(TestAnnotation.class);
		System.out.println("annotation---"+annotation);
	}
}

输出结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美码师

补习系列-springboot 参数校验详解

在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下:

93810
来自专栏xingoo, 一个梦想做发明家的程序员

【java开发系列】—— 自定义注解

  之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings?   原来这是java特有...

206100
来自专栏java 成神之路

Java 注解 Annotation

369130
来自专栏IT可乐

Java IO详解(七)------随机访问文件流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532 Java IO 流的分类介绍:ht...

34080
来自专栏androidBlog

Android 自定义编译时注解1 - 简单的例子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

7110
来自专栏分布式系统进阶

Kafka中Message存储相关类大揭密Kafka源码分析-汇总

22910
来自专栏三好码农的三亩自留地

Java动态代理-实战

说动态代理之前,要先搞明白什么是代理,代理的字面意思已经很容易理解了,我们这里撇开其他的解释,我们只谈设计模式中的代理模式

31120
来自专栏程序员宝库

徒手撸框架---实现 Aop

原文:犀利豆的博客(https://www.xilidou.com/2018/01/13/spring-aop/) 上一讲我们讲解了 Spring 的 IoC ...

311120
来自专栏pangguoming

Java Annotation 及几个常用开源项目注解原理简析

PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotatio...

45550
来自专栏Golang语言社区

GoStub框架使用指南

序言 要写出好的测试代码,必须精通相关的测试框架。对于Golang的程序员来说,至少需要掌握下面四个测试框架: GoConvey GoStub GoMock M...

57170

扫码关注云+社区

领取腾讯云代金券