Annotation介绍
概念
注解Annotation是java 1.5的新特性,是一种可以添加到 Java 源代码的语法元数据。类、方法、变量、参数、包均可以被注解,可用来将信息元数据与程序元素进行关联。java
做用
a. 标记,用于告诉编译器一些信息
b. 编译时动态处理,如动态生成代码
c. 运行时动态处理,如获得注解信息数组
Java注解能够用在构建期。当构建咱们的工程时,构建进程会编译源码、生成xml文件,打包编译后的代码和文件到jar包。构建过程通常由构建工具自动完成,经常使用的构建工具备ant、maven。构建工具在构建时会自动扫描咱们的代码,当遇到构建期注解时,会根据注解的内容生成源码或者其它文件。
架构
注解的格式
a)一个java注解由一个@符后面跟一个字符串构成,例如:@nameapp
b)java注解中通常包含一些元素,这些元素相似于属性或者参数,能够用来设置值,例如@Enity(name="jiang",age="20")maven
使用细节
注解能够用于描述一个类、接口、方法、方法参数、字段、局部变量等。ide
1.若是注解没有参数则不用写参数体工具
2.若是只有一个参数好比named value,则参数名能够省略this
3.也能够同时使用多个注解来标示spa
4.能够重复使用注解,不过只有在java SE 8 才支持.net
Java 经常使用注解
内置注解
-
@Override 表示当前方法覆盖了父类的方法,主要用在一个子类的方法中。
-
@Deprecated 表示方法已通过时,java不同意使用这些被描述的对象方法上有横线,使用时会有警告
-
@SuppviseWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告,例如进行了一个不安转的类型转换)。
元注解:用来描述注解的注解
-
@Documented:告诉JavaDoc工具,当前注解自己也要显示在Java Doc中。
-
@Retention:用来定义当前注解的做用范围,有如下范围:
-
- RetentionPolicy.SOURCE : 注解只存在于源码中,不会存在于.class文件中,在编译时会被忽略掉
- RetentionPolicy.CLASS:注解只存在于.class文件中,在编译期有效,可是在运行期会被忽略掉,这也是默认范围
- RetentionPolicy.RUNTIME:在运行期有效,JVM在运行期经过反射得到注解信息。
-
@Target:用于指定注解做用于java的哪些元素,未标注则表示可修饰全部。
-
@Inherited:表示当前注解会被注解类的子类继承。
自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其余细节。在定义注解时,不能继承其余的注解或接口。@interface用来声明一个注解,其中的每个方法其实是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。能够经过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.全部基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上全部类型的数组
注解元素必须有肯定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。所以, 使用空字符串或0做为默认值是一种经常使用的作法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,由于每一个注解的声明中,全部元素都存在,而且都具备相应的值,为了绕开这个约束,咱们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
上手实验
a.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* 水果名称注解
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface front{ //自定义注解 @front
String value() default "";
}
b.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* 水果颜色注解
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface behind{//自定义注解@behind
public enum Color{bule,red,green}
Color Behind() default Color.red;
}
c.java 部分
@front("Apple")
private String appleName;
@behind(Behind=Color.green)
private String appleColor;
public void setAppleColor(String appleColor) {
this.appleColor = appleColor;
}
在以前没有具体了解清楚annotation的功能,觉得在注解以后相应的变量会被赋值,因此在进行调试的时候看到变量的值一直都是null,为此感到很困惑,觉得是本身的哪些方法不对。后来经过仔细查阅发现annotation仅仅是相似于标签以及接口,对代码的运行没有起到什么效果。
总结
- 若是注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。
- 注解的基本语法,建立如同接口,可是多了个 @ 符号。
- 注解的元注解。
- 注解的属性。
- 注解主要给编译器及工具类型的软件用的。
- 注解的提取须要借助于 Java 的反射技术,反射比较慢,因此注解使用时也须要谨慎计较时间成本。
the examples in Hello1.java
hello1 :一个基于JavaServer Faces技术的应用程序,它使用两个XHTML页面和一个托管bean
首先须要了解 构造型:一种指定一下内容的注释:
CDI提供了一个名为的内置构造型Model
,它用于定义模型 - 视图 - 控制器应用程序架构的模型层的bean。这个构造型指定bean是@Named
和@RequestScoped
:
@Named @RequestScoped @Stereotype @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface Model {}
import javax.enterprise.context.RequestScoped;
/**
* 虽然RequestScoped必须与规范要求的内置请求上下文相关联,但容许第三方扩展将其与本身的上下文相关联。
* 指定bean是请求范围的
* 1.请求范围处于活动状态
* 2.请求上下文被销毁
*/
import javax.inject.Named;
/**
* 基于字符串的限定符
* Example usage:
public class Car {
@Inject @Named("driver") Seat driverSeat;
@Inject @Named("passenger") Seat passengerSeat;
...
}
*若是使用bean类的默认名称,则能够指定@Model 为注释,而没必要同时指定@Named和@RequestScoped.
*该@Model注释被称为刻板印象,对于封装等注解注释的术语。
*/
//
@Named
@RequestScoped
public class Hello {}
部分借鉴于:https://blog.csdn.net/u013703461/article/details/66259013
https://blog.csdn.net/briblue/article/details/73824058
很是感谢~