前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java注解

Java注解

作者头像
xiangzhihong
发布2018-02-05 14:39:42
1.4K0
发布2018-02-05 14:39:42
举报
文章被收录于专栏:向治洪向治洪

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

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

代码语言:javascript
复制
@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 – 定义该注释和子类的关系

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

注解例子

自定义注解:

代码语言:javascript
复制
/**
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();
}

枚举类:

代码语言:javascript
复制
public enum TestEnum {
	CANCEL {public String getName() {return "cancel";}},
	WAITE {public String getName() {return "waite";}},
	OK {public String getName() {return "ok";}},
}

测试

代码语言:javascript
复制
@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);
	}
}

输出结果:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档