什么是注解
通過反編譯class文件可以看出,注解就是接口胃珍,注解中的屬性就是接口下面的抽象方法
注解作用
用來標(biāo)記某個程序(功能)瘤泪,然后讓其他程序根據(jù)注解信息決定怎么去對待他們
自定義注解
//自定義注解
public @interface MyTest1 {
String name();
boolean a() default true;
int age();
}
public @interface MyTest2 {
String value();
}
使用注解
//自定義注解的使用
@MyTest1(name = "小明",age = 12)
public class Demo1 {
@MyTest2("小劉")
public void eat () {
}
}
元注解
指的是:修飾注解的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest2 {
String value();
}
常見的兩個元注解
@Retention(RetentionPolicy.RUNTIME)
作用:聲明注解的保留周期
1.SOURCE
只作用在源碼階段刃永,字節(jié)碼文件不存在
2.CLASS(默認(rèn)值)
保留到字節(jié)碼文件階段,運行階段不存在
3.RUNTIME(開發(fā)常用)
一直保留到運行階段
@Target(ElementType.METHOD)
作用:聲明被修飾的注解只能用在哪些位置
1.TYPE炫彩,類匾七,接口
2.FIELD,成員變量
3.METHOD媒楼,成員方法
4.PAEAMETER乐尊,方法參數(shù)
5.CONSTRUCTOR,構(gòu)造器
6.LOCAL_VARIABLE划址,局部變量
注解應(yīng)用場景
模擬junt框架
自定義一個注解MyTest扔嵌,用來表示哪些方法需要測試,哪些方法>不需要測試夺颤,加了@MyTest注解的需要測試痢缎,否則不需要測試,
在main函數(shù)中通過反射獲取到加了注解的方法世澜,通過執(zhí)行main方>法独旷,帶有@MyTest注解的也會跟隨者執(zhí)行
import java.lang.reflect.Method;
public class AnnotationTest {
@MyTest
public void test1(){
System.out.println("test1");
}
@MyTest
public void test2(){
System.out.println("test2");
}
//@MyTest
public void test3(){
System.out.println("test3");
}
//@MyTest
public void test4(){
System.out.println("test4");
}
public static void main(String[] args) throws Exception {
AnnotationTest a = new AnnotationTest();
//啟動程序
Class c = AnnotationTest.class;//獲取類對象
Method[] methods = c.getDeclaredMethods();//獲取類下面的所有方法
//遍歷這個數(shù)組中的每個方法,看上面是否存在@MyTest注解,存在則執(zhí)行該方法
for (Method method : methods) {
if (method.isAnnotationPresent(MyTest.class)) {
//說明當(dāng)前方法上是存在@MyTest注解的嵌洼,觸發(fā)當(dāng)前方法執(zhí)行
method.invoke(a);//觸發(fā)該方法案疲,invoke該方法需要傳一個對象,隨便傳一個都可以
}
}
}
}