测试类
package com.baizhi;
@Book(value="百科全书类",name="百科全书类",authors ="{zhangsan,lisi}")
public class BaiKe {
@Book(value="百科全书方法",name="百科全书方法",authors ="{}")
public String getBaikeBook(){
System.out.println("百科全书");
return "";
}
}
自定义注解
package com.baizhi;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解 @target作用是注解自定义注解的的注解,指定自定义注解标记的范围
/**:
* type:表示自定义注解可以标记到类和接口上
* METHOD:表示自定义注解可以标记到方法上
* FIELD:表示自定义注解可以标记到属性上
* PARAMETER:表示自定义注解可以标记到参数上
* 等等
*/
//Retention 注解主要作用是指定自定义注解的生命周
/**:
* SOURCE:表示自定义注解只存活于源码阶段
* CLASS:表示自定义注解存活于源码阶段,编译阶段,在运行阶段不存在
* RUNTIME:表示自定义注解存活于源码阶段,编译阶段,及运行阶段
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Book {
String value();
String name();
String[] authors();
}
demo测试
package com.baizhi;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Mytest {
public static void main(String[] args) throws NoSuchMethodException {
Class c = BaiKe.class;
Method m = c.getDeclaredMethod("getBaikeBook");
//判断当前类上是否有@Book注解
if(c.isAnnotationPresent(Book.class)) {
//获取到类上的注解对象
Book book = (Book) c.getDeclaredAnnotation(Book.class);
//打印出注解对象中的属性值
System.out.println(book.name());
System.out.println(Arrays.toString(book.authors()));
}
//判断当前类上是否有@Book注解
if(m.isAnnotationPresent(Book.class)) {
//获取到类上的注解对象
Book book = (Book) m.getDeclaredAnnotation(Book.class);
//打印出注解对象中的属性值
System.out.println(book.name());
System.out.println(Arrays.toString(book.authors()));
}
}
}
场景:
自定义注解可以用在记录日志的操作中,通过和Aop结合,当切入后可以获取到切入类对象中的所有方法,然后循环遍历所有的方法判断方法中是否中有标注的自定义注解对象,从而记录方法上的日志内容。