注解的实现
1.概念
注解表示一個標識(標注、標記),它可以用在類上、方法上、變量上等,給類的各個組成部分一些額外的表示,能夠被編譯器識別。
2.常見注解
@Override: 描述一個方法是復寫的父類方法
@Deprecate: 描述一個方法是過時的方法,調用過時的方法會有一個橫線
@SuppressWarnings(value = “all”): 壓制警告:寫在類上,則壓制整個類的警告,在方法上則壓制方法上的警告
3.自定義注解
【在使用注解的時候如果注解里面的屬性沒有指定默認值,那么我們就需要手動給出注解屬性的設置值。】
public @interface Anno {//定義一個基本類型的屬性//public屬性類型屬性名() default 默認值;int a() default 23 "張三";//定義一個String類型的屬性public String name() default 23;//定義一個class類型的屬性public Class clazz() default Anno2.class;//定義一個注解類型的屬性public Anno2 anno() default @Anno2;//定義一個枚舉類型的屬性public Week week() default Week.Monday;//以上類型的一維數組//int 數組public int [] arr() default {1,2,3,4,5}//枚舉數組public Week[] weeks() default{Week.Monday}public String value();//特殊屬性value 變量只有一個,則使用時可以省略名稱直接賦值 }//類上使用注解 //在使用注解的時候如果注解里面的屬性沒有指定默認值,那么我們就需要手動給出注解屬性的設置值。 //此處相當于Anno的對象,只是給類或者方法添加了一個標簽,不會影響實體 @Anno("李四") public class Demo1 {public static void main(String[] args) {} }4.元注解
@Target:指定了注解能在哪里使用【成員變量、類、方法】
@Retention:可以理解為保留時間(生命周期)
@lnherited:表示修飾的自定義注解可以被子類繼承
@Documented:表示該自定義注解,會出現在API文檔里面
5.自定義注解實現
測試讓有注解的方法執行,沒有Test的方法不執行
//自定義注解 //元注解[對注解進一步進行說明] @Target(ElementType.METHOD)//指定注解可以用在哪些地方 @Retention(RetentionPolicy.RUNTIME)//表示注解的存活時間可以到運行 //定義一個注解 public @interface Test { }//方法類 public class UseTest {//沒有使用Test注解public void show(){System.out.println("UseTest....show....");}//使用Test注解@Testpublic void method(){System.out.println("UseTest....method....");}//使用Test注解@Testpublic void function(){System.out.println("UseTest....function....");} }//測試類 //測試讓有注解的方法執行,沒有Test的方法不執行 public class AnnoDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//通過反射獲取UseTest的字節碼文件對象Class<?> clazz = Class.forName("com.itheima2.UseTest");//2.通過反射獲取這個類里面所有方法的對象Method[] methods = clazz.getDeclaredMethods();//創建對象用于執行方法Object o = clazz.getConstructor().newInstance();//遍歷數組,得到每一個方法對象for (Method method : methods) {//getAnnotation(Test.class)返回原方法上額外的注解Test test = method.getAnnotation(Test.class);//如果有注解,就執行if (test != null) {//注解沒有設置存活時間,則打印無結果method.invoke(o);}//method.isAnnotationPresent(Test.class)判斷方法上是否有注解,有則返回true/*if(method.isAnnotationPresent(Test.class)){method.invoke(o);}*/}} }打印結果: ------------------------------------------------------------------------------- UseTest....method.... UseTest....function....總結
- 上一篇: 枚举的实现
- 下一篇: 三国志2安卓版(三国志2安卓)