目录
一、概述
二、定义注解类
2.1 注解定义
2.2 注解属性类型
2.3 注解的作用目标限定
2.4 注解类型
三、使用注解
四、读取注解(反射)
4.1 反射Class上注解
4.2 反射method上注解
一、概述
注解是为了取代配置文件,使用注解进行配置,其语法为:@注解名称(注解参数)。
使用注解分为三步:
1.定义注解类
2.使用注解
3.读取注解
二、定义注解类
2.1 注解定义
//定义注解
@interface student{
//定义注解中的属性,格式:类型 名称()
String name();
//携带默认值
int age() default 100;
}
//value属性
@interface stud{
int value();
String address() default "hz";
}
2.2 注解属性类型
注解支持的属性类型:
基本数据类型、String、Class、Enum、注解类型、上述一维数组类型
enum MyEnum{
A,B,C
}
@interface myAnnota{
//1.基本类型
int a();
//2.String类型
String b();
//3.Class类型
Class c();
//4.enum类型
MyEnum d();
//5.注解类型
student e();
//6.以上类型的一维数组类型
String[] f();
}
2.3 注解的作用目标限定
限定注解的使用目标,如类使用的注解、方法使用的注解等
@Target(value={ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@interface myAnno{
int age;
}
可选参数ElementType:
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE
}
2.4 注解类型
一般选择RUNTIME类型注解,可以被反射
@Retention(value=RetentionPolicy.RUNTIME)
@interface student{
//定义注解中的属性,格式:类型 名称()
String name();
//携带默认值
int age() default 100;
}
三、使用注解
使用场景:类、方法、构造器、参数、变量、包
//使用注解
@student(name="xiaoming",age=23)
public class Demo {
//默认给value赋值,场景:只给value赋值时可以省略value=
@stud(200)
private int id;
}
//注解属性类型使用
@myAnnota(
a=100,
b="lilei",
c=String.class,
d=MyEnum.A,
e=@student(age=35,name="lucy"),
f={"beijing","shanghai","guangzhou"}
)
class Demo{
}
四、读取注解(反射)
4.1 反射Class上注解
//定义注解
@Retention(value=RetentionPolicy.RUNTIME)
@interface student{
//定义注解中的属性,格式:类型 名称()
String name();
//携带默认值
int age() default 100;
}
//使用注解
@student(name="xiaoming",age=23)
class DemoClass {
//默认给value赋值,场景:只给value赋值时可以省略value=
@stud(200)
private int id;
@stud(30)
public void func(){}
}
//反射注解
@Test
public void reflectAnnotation(){
//1.获取目标
Class<DemoClass> clazz = DemoClass.class;
//2.获取指定类型的注解
student stu = clazz.getAnnotation(student.class);
//3.访问注解对象的属性
System.out.println("[name : "+stu.name()+", age : "+stu.age()+"]");
}
输出:
[name : xiaoming, age : 23]
4.2 反射method上注解
//定义注解
@Retention(value=RetentionPolicy.RUNTIME)
@interface stud{
int value();
String address() default "hz";
}
//使用注解
@student(name="xiaoming",age=23)
class DemoClass {
//默认给value赋值,场景:只给value赋值时可以省略value=
@stud(200)
private int id;
@stud(30)
public void func(){}
}
//反射注解
@Test
public void reflectMethodAnnotation() throws NoSuchMethodException, SecurityException{
//1.获取目标
Class<DemoClass> clazz = DemoClass.class;
Method methodFunc = clazz.getMethod("func");
//2.获取指定类型注解
stud stu = methodFunc.getAnnotation(stud.class);
//3.访问注解对象属性
System.out.println("[value : "+stu.value()+" , address : "+stu.address()+"]");
}
输出:
[value : 30 , address : hz]