什么是注解
从JDK5.0之后,Java增加了对元数据的支持,也就是Annotation。
注解其实就是代码里的特殊标记,这些标记可以在编译,加载,运行时被读取,并执行相应的处理。通过注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
注解可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在注解的name=value
对中。
未来的开发模式基本就是基于注解,可以说框架=注解+反射+设计模式。
在使用注解时要在其前面增加@
符号,并把注解当做一个修饰符来使用,用来修饰它支持的程序元素。
常见的注解实例
-
@auther:标明开发该类模块的作者,多个作者之间使用
,
分割。 -
@version:表明该类模块的版本
-
@see:参考转向,也就是相关主题
-
@since:从哪个版本开始增加的
-
@param:对方法中某参数的说明,如果没有参数就不能写。可以由多个,格式为:形参名 形参类型 形参说明
-
@return:对方法中返回值的说明,如果返回值类型是void就不能写。格式为:返回值类型 返回值说明
-
@exception:对方法中可能抛出异常进行说明,如果方法没有用throws显式抛出异常就不能写。可以由多个,格式为:异常类型 异常说明
-
@Override:限定重写父类方法,该注解只能用于方法
-
@Deprecated:用于表示所修饰的元素(类,方法)已过时。通常是因为所修饰的构造危险或存在更好的选择
-
@SuppressWarnings:抑制编译器警告
package com.annotation;
/**
* @author han
* @version 1.0
* @see com.anntation
* @since
*/
public class AnnotationTest {
}
class Person {
@SuppressWarnings("unused")
private String name;
@SuppressWarnings("unused")
private int age;
public Person() {
}
public Person(final String name, final int age) {
this.name = name;
this.age = age;
}
public void walk(){
System.out.println("人走路");
}
public void eat(){
System.out.println("人吃饭");
}
@Deprecated
public void date(){
System.out.println("几点啦");
}
}
class Student extends Person{
@Override
public void walk() {
System.out.println("学生走路");
}
/**
* @param str string 传入窝窝头
* @return string 窝窝头,一块钱四个,嘿嘿
* @throws Exception
*/
public String eat(String str) throws Exception{
str = str + ",一块钱四个,嘿嘿";
return str;
}
}
自定义注解
想要自定义注解,就得先看看jdk中注解是怎么定义的,先看一下@Override
:
package java.lang;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
可以看到他在定义的时候,使用了一个关键字:@interface
自定义注解还有以下特点:
- 自定义注解自动继承
java.lang.annotation.Annotation
接口 - 成员变量以无参形式声明。但是其方法名与返回值类型定义了该成员的名字与类型。类型包含八种基础数据类型与class类,enum类,annotation类所有类型的数组。
- 可以为其成员变量指定初始值,但是必须以default声明。
- 如果只有一个参数,建议使用value。
- 如果定义的注解中有配置参数,那么使用的时候必须指定参数值,除非有默认值。格式为"参数名=参数值"。
- 如果只有一个参数成员,可以忽略"value="
- 没有成员变量的注解被称为标记,有成员变量的注解被称为元数据注解
package com.annotation;
/**
* @author han
*/
public @interface MyAnnotation {
String value() default "hello";
}
----------
package com.annotation;
@MyAnnotation("hi")
public class Cs {
}
元注解
元数据是修饰数据的数据,元注解就是修饰注解的注解。
JDK5.0提供了4个元注解,分别是:
-
Retention
用来指定该注解的声明周期,使用此元注解必须为value成员变量指定值:
- RetentionPolicy.SOURCE:在源文件中有效,会被编译器抛弃
- RetentionPolicy.SOURCE:在class文件中有效,在运行时不加载,默认值
- RetentionPolicy.RUNTIME:在运行时有效,可以通过反射读取
package com.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author han
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";
}
-
Target
用来指定该注解能够修改哪些程序元素:
- TYPE :类,接口,枚举类
- FIELD:属性
- METHOD:方法
- PARAMETER:形参
- CONSTRUCTOR:构造器
- LOCAL_VARIABLE:局部变量
package com.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @author han
*/
@Target(ElementType.TYPE)
public @interface MyAnnotation {
String value() default "hello";
}
-
Documented
表示所修饰的注解在被javadoc解析时,保留下来
-
Inherited
被他修饰的Annotation将具有继承性。其子类将拥有被Inherited修饰过的注解的功能。
JDK8中注解的新特性
-
可重复注解
如果想要对一个注解重复使用两次,可以将value改为一个数组。
package com.annotation; /** * @author han */ @Repeatable(MyAnnotation.class) public @interface MyAnnotation { MyAnnotation[] value(); } ---------- package com.annotation; @MyAnnotation(value = "hi") @MyAnnotation(value = "java") public class Cs { }
Java小白修炼手册
-
类型注解
ElementType.TYPE_PARAMETER 表示该注解可以写在类型变量的声明语句中
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中