从JDK5开始,Java增加对元数据的支持,也就是 注解(Annotation) ,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。
注释 ( comment ) 用于注解说明解释程序的文字就是 注释 。
- 注解入门
- 内置注解
- 自定义注解,元注解
注解入门
注解是JAVA5开始引入的新技术。注解其实就是代码里的特殊标记,它用于替代配置文件:传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
注解的作用:
- 注解不属于代码,但它可以对程序做出解释
- 可以被其它程序(如编译器等)读取,有助于其它程序可以进行针对性的优化。
注解的格式:
- 注解是以“@注释名”在代码中存在的,还可以添加参数值,例如:@SuppressWarning(value=“unchecked”)
注解在哪里使用?
- 可以附加在package, class, method, field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
package com.peng.annotation;
public class Test {
// @Override 就是重写的注解,一般idea里黄色的字都是注解
@Override
public String toString() {
return super.toString();
}
}
内置注解
内置注解是系统自带的注解,一般使用较多。
- @Override:定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法申明。
- @Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常十一位内它很危险或者存在更好的选择。(Deprecated: adj.弃用的)
- @SuppressWarnings:定义在java.lang.SuppressWarrings中,用来抑制编译时的警告信息。与前两个注解,该注解必须添加一个参数才可使用,且参数都是内置时已定义好的,如"all",“unchecked”,{“all”,“unchecked”}等
元注解
除了直接使用JDK 定义好的注解,我们还可以自定义注解,在JDK 1.5中提供了4个标准的用来对注解类型进行注解的注解类,我们称之为 meta-annotation(元注解),他们分别是:
-
@Target
- 用于解释我们的注解将用于什么范围(例如一个方法或一个域),该范围有一个明确的枚举类 ElemenetType。
-
@Retention
- 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy中。
-
@Documented
- 表示将此注解包含在javadoc中,它表示此注解会被javadoc提取成文档。
-
@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.以上所有类型的数组
小技巧:当注解只有一个时,且其值名为value,则value可以省略。
package com.peng.annnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 自定义注解
public class Test {
// 注解可以显示赋值, 如果没有默认值, 就必须给注解复制
@MyAnnotation(name = "", age = 18, id = 1, schools = {})
// 当注解只有一个时,且其值名为value,则value可以省略
@MyAnnotation2("")
public void test(){
}
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
// 注解的参数: 参数类型 + 参数名();
String name() default "";
int age() default 18;
int id() default -1; //常用小技巧,设置-1表示这项找不到,表示为空。
String[] schools() default {"浙江工商大学", "浙江大学"};
}
@interface MyAnnotation2{
String value();
}