自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface TestAnnotation {
String name();
int getCode() default 0;
}
在Person类中使用上面注解
@TestAnnotation(name = "00",getCode = 0)
public class Person {
private String TAG = "Person";
@TestAnnotation(name = "123")
public String name;
@TestAnnotation(name = "4", getCode = 4)
public void gotoWork(int time) {
Log.i(TAG, "gotoWork: ");
}
}
解析注解的代码
class AnnotationMain {
public static void main(String[] args) {
Person person = new Person();
Class<? extends Person> aClass = person.getClass();
// aClass对应的类是否被注解
if (aClass.isAnnotationPresent(TestAnnotation.class)) {
// 获取指定的注解
TestAnnotation annotation = aClass.getAnnotation(TestAnnotation.class);
System.out.println("jieguo:" + annotation.name() + "," + annotation.getCode());
}
// 获取方法上的注解
try {
Class<?> personClass = Class.forName("annotation.Person");
Method gotoWork = personClass.getMethod("gotoWork", int.class);
if (gotoWork.isAnnotationPresent(TestAnnotation.class)) {
TestAnnotation annotation = gotoWork.getAnnotation(TestAnnotation.class);
System.out.println("method:" + annotation.name() + "," + annotation.getCode());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
// 属性上的注解
Class<?> aClass1 = null;
try {
aClass1 = Class.forName("annotation.Person");
// name 在person中是public 修饰的属性,可以用aClass1.getField("name");
// 如果name不是用public修饰的,需要用getDeclaredField,他可以获取person中的所有的属性,找到name
Field name = aClass1.getField("name");
if (name.isAnnotationPresent(TestAnnotation.class)) {
TestAnnotation annotation = name.getAnnotation(TestAnnotation.class);
System.out.println("feild:" + annotation.name() + "," + annotation.getCode());
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
}
}
}
一,注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
- 修饰符
访问修饰符必须为public,不写默认为pubic; - 关键字
关键字为@interface;
在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation接口。
二,元注解
@Retention
表明该注解的生命周期
生命周期类型 描述
RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
public @interface CherryAnnotation {
public String name();
int age() default 18;
int[] array();
}
注解里面定义的是:注解类型元素!
定义注解类型元素时需要注意如下几点:
- 访问修饰符必须为public,不写默认为public;
- 该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型(体现了注解的嵌套效果)以及上述类型的一位数组;
- 该元素的名称一般定义为名词,如果注解中只有一个元素,请把名字起为value(后面使用会带来便利操作);
- ()不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法;
- default代表默认值,值必须和第2点定义的类型一致;
- 如果没有默认值,代表后续使用注解时必须给该类型元素赋值。
看到了一个非常详细的注解的讲解,我就不再写了:https://blog.csdn.net/xsp_happyboy/article/details/80987484
三,注解需要掌握的基本方法
1.放射:Class.forName("annotation.Person");
2.personClass.getMethod,通过反射获取Method
3.getDeclaredField("name")/getField("name"),获取属性Field
4.getAnnotation(TestAnnotation.class);获取指定的注解
5.getAnnotations();获取该类/方法/属性上的所有的注解
网友评论