Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式。注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样。那么,注解到底可以做什么呢?

1、注解的作用。

  • 提供用来完整地描述程序所需要的信息,如编译期校验程序信息。
  • 生成描述符文件,或生成新类的定义。
  • 减轻编写“样板”代码(配置文件)的负担,可以使用注解自动生成。
  • 更加干净易读的代码。
  • 编译期类型检查。

2、Java提供的注解

Java5内置了一些原生的注解,它们仅次于java.lang包下(不止于此):

  • @Override,表示当前的方法定义将覆盖超类中的方法。
  • @Deprecated,标识元素为弃用的,如果程序员使用了注解为它的元素,编译器会发出警告信息。
  • @SuppressWarnings,关闭不当的编译器警告信息。

以上注解均为源码级别注解(即为RetentionPolicy.SOURCE标注,需要注意的是,虽然@Deprecated是由RetentionPolicy.CLASS标注,但是所起的作用主要还是在编译期),仅编译器可读取,编译成class将会舍弃,当然,运行时就更不会存在了。

Java还提供了一些元注解,用于自定义注解(meta-annotations),如@Target、@Retention、@SupportedSourceVersion等。java.lang.annotation包中的元注解:

@Retention 指定标识的注解如何保存。

  • RetentionPolicy.SOURCE – 注解将仅保存在源代码级别,将会被编译器丢弃。
  • RetentionPolicy.CLASS – 将会在编译时期使用,并保存在class中,但JVM不会识别此。
  • RetentionPolicy.RUNTIME – 此注解将会被JVM识别,理论上将会在任意时期都会存在。

@Documented 表明该注解标识的元素所使用的注解应该出现在javadoc中。

@Target 指定哪种JAVA元素可以使用当前定义的注解,指定类型(ElementType)如下:

  • ElementType.ANNOTATION_TYPE 注释类型声明。
  • ElementType.CONSTRUCTOR 构造方法声明。
  • ElementType.FIELD 字段声明(包括枚举常量)。
  • ElementType.LOCAL_VARIABLE 局部变量声明。
  • ElementType.METHOD 方法声明。
  • ElementType.PACKAGE 包声明。
  • ElementType.PARAMETER 参数声明。
  • ElementType.TYPE 类、接口(包括注释类型)或枚举声明。

@Inherited  指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。

注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。

@Repeatable (Java8中增加)使用此注解注释的注解,在使用时是可重复使用的。注意,在Java8之前注解同一个注解在同一个元素上是不可以多次使用的。

3、定义注解

大多数时候,开发者需要自己定义注解以满足不同的需求。

定义注解,注解一般包括注解的定义、注解元素、元注解,示例如下:

package com.zenfery.example.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.CLASS)

public @interface ClassInfo {

 String value() default "default";

}

3.1、注解的定义

使用关键字@interface来定义,如上public @interface ClassInfo,注解的权限限定符仅支持public、default(包访问权限)。

3.2、元注解

如上@Target(ElementType.TYPE),表示注解ClassInfo可用于类、接口、或者枚举类型。

3.3、注解元素

注解元素使用类似普通方法的定义格式,如上述例子中的value(),使用default指定默认值。注解元素在使用时必须有值,要么是默认值,要么在使用注解是提供元素的值。且注解元素的值不能为null值。

注解元素的可用类型有:所有的基本类型、String、Class、enum、Annotation、以上类型的数组。如果使用复杂类型的注解,可使用注解的嵌套来实现。如果程序员的注解中定义了名为value的元素,并且在应用该注解的时候,如果该元素是唯一需要赋值的一个元素,那么此时无需使用名-值对的语法,而只需在括号内给出value元素所需的值即可。

3.4、注解不支持继承

不可使用extends关键字继承某个@interface。可以使用嵌套来实现相似的功能。

4、注解的使用

如果要使用以上的注解,可像如下这种方式使用:

package com.zenfery.example.annotation.clazz;

import com.zenfery.example.annotation.ClassInfo;

@ClassInfo("这是HelloAnnotation类。")

public class HelloAnnotation {

}

转载请注明:子暃之路 ? Java注解(1)-注解基础

时间: 2024-10-11 17:48:08

Java注解(1)-注解基础的相关文章

Java中的注解的详解

详解Java中的注解 在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色: 编译器指令 构建时指令 运行时指令 l Java内置了三种编译器指令,本文后面部分会重点介绍 l Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如A

Java笔记:注解

一.基础知识 Java支持在源文件中嵌入补充信息,这类信息称为注解(元数据).注解不会改变程序的行为,因此也不会改变程序的语义. 二.声明 上述声明表示注解.注解都只能包含方法声明,不能为这些方法提供实现,而是由Java实现.所有的注解类型都自动扩展了Annotation接口,其指定了annotationType方法,该方法返回调用注解的对象. 在声明了注解之后就可以用来注解声明了.所有的声明都可以有与之关联的注解,甚至注解本身也可以被注解.使用注解时,需要为注解的成员提供值. class So

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处理.apt是命令行工具,与之配套的是一套描述"程序在编译时刻的静态结构"的API:Mirror API(com.sun.mirror.*).通过Mirror API可以获取到被注解的Java类型元素的信息,从而提供自定义的处理逻辑.具体的处理工具交给apt来处理.编写注解处理器的核心是两个

Java高级之注解、反射

Java的注解.反射等机制的产生,让动态代理成为可能,一般通过全限定名+类名,找到类,可以invoke它的构造方法以及其他方法,可以获取它的参数(Field)名称和值. 注解一般用在代码的注释上.代码审查上(有没有按标准写,比如inspect).代码注入(hook,asbectj),需要考虑的是,在何时注入(编译期还运行期) 反射一般用在动态将json和Object互相转化,执行相关底层代码,比如设置某个类的Accessible为false,防止别人hook修改 例:阿里的FastJson解析:

【java】java中的注解(Annotation)是如何工作的?

Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架).这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧. 什么是注解? 用一个词就可以描述注解,那就是元数据,即

深入理解Java注解之:注解的使用

注解是jdk1.5新增的特性.大家都知道,jdk1.5在java的发展史上有着划时代的意义.而注解的出现,在某种程度上颠覆了框架的设计.比如,spring在注解出现后,改善了原先五大组件的模式,增加了基于注解的实现方式.现在重点讲讲注解的使用. 元注解:       jdk1.5定义了4个元注解,元注解的作用是注解其他的注解. [email protected] [email protected] [email protected] [email protected] @Retention用于指

从头认识Spring-2.4 基于java的标准注解装配[email protected](2)-通过set方法或者其它方法注入

这一章节我们来讨论一下基于java的标准注解装配标签@Inject是如何通过通过set方法或者其它方法注入? 在使用@Inject标签之前.我们须要在pom文件中面增加以下的代码: <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>

从头认识Spring-2.4 基于java的标准注解装配[email&#160;protected]限定器@Named

这一章节我们来讨论一下基于java的标准注解装配标签@Inject的限定器@Named. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_16; import javax.inject.Named; @Named("myCake") public class Cake { private String name = ""; public String getName(