亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDK中使用注解和自定義注解的示例分析

發布時間:2021-07-27 15:04:20 來源:億速云 閱讀:125 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關JDK中使用注解和自定義注解的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

JDK中的三個基本注解

a、@Override:檢查子類確實是覆蓋了父類的方法。
b、@Deprecated:說明已經過時了。
c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的類型。{}數組。all抑制所有警告。

簡單使用:

public class Demo1 {
  //@SuppressWarnings({ "deprecation", "unused" })
  @SuppressWarnings("all")
  public void fun()
  {
    int i = 5;
    System.out.println("hello");
    System.out.println(new Date().toLocaleString());
  }
}
class Tests extends Demo1
{
  @Override
  public void fun()
  {
    super.fun();
  } 
  @Deprecated
  public void tt()
  {
    System.out.println(new Date().toLocaleString());
  }
}

聲明一個注解 @interface 注解名{}

public @interface MyAnnotation{}

注解它的本質就是一個接口,這個接口需要繼承 Annotation接口。

public interface MyAnnotation extends java.lang.annotation.Annotation {
}

注解的屬性類型:

  •     1.基本類型

  •     2.String

  •     3.枚舉類型

  •     4.注解類型

  •     5.Class類型

  •     6.以上類型的一維數組類型

具體是怎樣定義的呢,我們看代碼:

public @interface MyAnno1 {
  //注解中定義的都是屬性
  int age() default 20;
  String[] name() default "hehe";
  String value() default "haha";
  Love love();
  //MyAnno2 anno();
  //public static final int num = 5;//可以
  //public abstract void fun();//error
}

使用自定義注解:

public class Demo2 {
  //@MyAnno1(age=25,name={"jack","lucy"},value="zhengzhi")
  //@MyAnno1(value="zhengzhi")
  @MyAnno1(value="zhengzhi",love=Love.eat)
  public void tests()
  {
  }
}

如果在沒有默認值的情況下,使用自定義注解我們需要設置注解中屬性的值。

注解的反射:(靈魂)

模擬Junit的@Test
a、反射注解類
java.lang.reflect.AnnotatedElement:
?<T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定類型的注解引用。沒有返回null。
?Annotation[] getAnnotations():得到所有的注解,包含從父類繼承下來的。
?Annotation[] getDeclaredAnnotations():得到自己身上的注解。
boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判斷指定的注解有沒有。
Class、Method、Field、Constructor等實現了AnnotatedElement接口.
如果:Class.isAnnotationPresent(MyTest.class):判斷類上面有沒有@MyTest注解;
Method.isAnnotationPresent(MyTest.class):判斷方法上面有沒有@MyTest注解。

下面通過代碼實現一下。

我們模擬實現@Test注解的功能

首先這是我們的注解@MyTest

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//元注解: 用來注解注解的
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
  long timeout() default Integer.MAX_VALUE;//設置超時時間的
}

這是我們使用注解的類:

public class DBCRUD {
  @MyTest(timeout=1000000)
  public void addTest()
  {
    System.out.println("addTest方法執行了");
  }
  @MyTest
  public void updateTest()
  {
    System.out.println("updateTest方法執行了");
  }
}

當我們使用了注解,我們就需要判該類是否使用了注解,我們通過反射來實現。

private static void method1() throws IllegalAccessException,
    InvocationTargetException, InstantiationException {
    Class claz = DBCRUD.class;//得到字節碼文件對象
    //得到該類及父類中的所有方法
    Method[] methods = claz.getMethods();
    for(Method m:methods){
      //判斷方法是否使用了@MyTest這個注解
//     boolean boo = m.isAnnotationPresent(MyTest.class);
//     System.out.println(m.getName()+"===="+boo);//都是false 默認注解存活到 CLASS,改變存活到RUNTIME
      if(m.isAnnotationPresent(MyTest.class)){
        m.invoke(claz.newInstance(), null);
      }
    }
  }

這里我們需要注意的是,我們需要考慮到自定義注解的存活范圍。

默認的自定義注解只存活到編譯時期,class階段。

可以注意到,我們上面的自定義注解應用了@Retention注解,這個注解就是改變自定義注解的存活范圍。

這個注解也叫做元注解,只能用在注解上的注解叫做元注解。

上面的method方法沒有考慮到超時的問題,下面我們再完善一下。

//method1();
    //反射解析注解的屬性
    Class claz = DBCRUD.class;
    Method[] methods = claz.getMethods();
    for(Method m:methods){
      //從該方法上獲取MyTest注解
      MyTest mt = m.getAnnotation(MyTest.class);
      if(mt!=null){
        //得到注解中的屬性
        long out = mt.timeout();
        long start = System.nanoTime();
        m.invoke(claz.newInstance(), null);
        long end = System.nanoTime();
        if((end-start)>out)
        {
          System.out.println("運行超時");
        }
      }
    }

關于“JDK中使用注解和自定義注解的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jdk
AI

汉沽区| 嘉峪关市| 安阳市| 溧水县| 夏邑县| 获嘉县| 克什克腾旗| 普兰县| 高雄市| 岗巴县| 连江县| 玉门市| 泾川县| 蕉岭县| 容城县| 武平县| 叙永县| 永顺县| 尼勒克县| 苏尼特左旗| 聂荣县| 清河县| 新密市| 凤凰县| 团风县| 泉州市| 金坛市| 运城市| 麻阳| 宜宾县| 治县。| 康平县| 华阴市| 黄石市| 木里| 新邵县| 同德县| 西昌市| 辽中县| 岳池县| 比如县|