Java代码里的特殊标记。它在代码中添加用Java程序无法表达的额外信息提供了一种形式化的方法。
注释: 不会被程序所读取
注解: 可以在编译,类加载运行时被读取
二、注解的分类:
(1)内键注解
@Override
@Deprecated
@SuppressWarnings
(2)元注解( 四大类型)
@Target
指定被其修饰的注解能用于修饰哪些程序元素
成员变量value为ElementType 枚举类型
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention
指定该注解可使用反射读取
成员变量value:RetentionPolicy 枚举类型
@Documented
指定被其修饰的注解将被JavaDoc工具提取成文档
@Inherited
指定被其修饰的注解将具有继承性
(3)自定义注解
使用@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.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.
三、注解的使用
public class TestAnimal {
}
/**
* 父类
*
* @author Administrator
*
*/
class Animal {
public void show() {
}
}
@SuppressWarnings(value = { "unchecked" }) // 3)抑制警告
class Cat extends Animal {
@Override // 1)重写父类的方法
public void show() {
// TODO Auto-generated method stub
super.show();
}
@Deprecated // 2)已过时
public void display() {
}
}
自定义注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Documented;
/**
* 自定义注解
*
* @author Administrator
*
*/
@Documented
//@Target(value={ElementType.TYPE,ElementType.METHOD}) //只能作用于方法上
@Target(value={TYPE,METHOD,CONSTRUCTOR,FIELD})
@Retention(RetentionPolicy.RUNTIME) //反射
public @interface Emp {
String job();
// String job() default "manager"; // 成员变量的初值
}
public class TestEmp {
public String name;
@Emp(job="employee")
@Deprecated
public void show(){
}
}
测试自定义注解获得其值
/**
* (1)getAnnotation(Class<T> annotationClass)
返回该程序元素上存在的、指定类型的注解,如果该类型的注解不存在,则返回null
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
// 使用自定义注解TestEmp
//1) 获取TestEmp的Class实例 (3种方法)
Class<TestEmp> c = TestEmp.class;
//2)获取需要处理的方法Method实例
try {
Method method = c.getMethod("show", new Class[]{});
//3)//判断该方法是否包含Emp注解
if(method.isAnnotationPresent(Emp.class)){
//获取该方法的Emp注解实例
Emp emp = method.getAnnotation(Emp.class);
//获得注解的数据
System.out.println(emp.job());
}
// (2)Annotation[] getAnnotations()返回该程序元素上存在的所有注解
//获取方法上的所有注解
Annotation[] annotations= method.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}