最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例講解JDK注解的使用和自定義注解的方法

 更新時(shí)間:2019年03月12日 16:11:18   作者:Melissa_hexiu  
今天小編就為大家分享一篇關(guān)于舉例講解JDK注解的使用和自定義注解的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

JDK中的三個(gè)基本注解

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

簡(jiǎn)單使用:

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());
  }
}

聲明一個(gè)注解 @interface 注解名{}

public @interface MyAnnotation{}

注解它的本質(zhì)就是一個(gè)接口,這個(gè)接口需要繼承 Annotation接口。

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

注解的屬性類型:

  •     1.基本類型
  •     2.String
  •     3.枚舉類型
  •     4.注解類型
  •     5.Class類型
  •     6.以上類型的一維數(shù)組類型

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

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()
  {
  }
}

如果在沒(méi)有默認(rèn)值的情況下,使用自定義注解我們需要設(shè)置注解中屬性的值。

注解的反射:(靈魂)

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

下面通過(guò)代碼實(shí)現(xiàn)一下。

我們模擬實(shí)現(xiàn)@Test注解的功能

首先這是我們的注解@MyTest

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

這是我們使用注解的類:

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

當(dāng)我們使用了注解,我們就需要判該類是否使用了注解,我們通過(guò)反射來(lái)實(shí)現(xiàn)。

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

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

默認(rèn)的自定義注解只存活到編譯時(shí)期,class階段。

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

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

上面的method方法沒(méi)有考慮到超時(shí)的問(wèn)題,下面我們?cè)偻晟埔幌隆?/p>

//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("運(yùn)行超時(shí)");
        }
      }
    }

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 詳解tryAcquire()、addWaiter()、acquireQueued()

    詳解tryAcquire()、addWaiter()、acquireQueued()

    這篇文章主要tryAcquire()、addWaiter()、acquireQueued()的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • spring?IOC容器管理必須知道的一些操作(基于XML方式)

    spring?IOC容器管理必須知道的一些操作(基于XML方式)

    Spring框架的核心是Spring容器,容器創(chuàng)建對(duì)象,將它們裝配在一起,配置它們并管理它們的完整生命周期,下面這篇文章主要給大家介紹了關(guān)于spring?IOC容器管理必須知道的一些操作,需要的朋友可以參考下
    2022-03-03
  • spring使用xml方式整合Druid數(shù)據(jù)源連接池

    spring使用xml方式整合Druid數(shù)據(jù)源連接池

    傳統(tǒng)的JDBC數(shù)據(jù)庫(kù)連接方式,每次連接都需加載Connection到內(nèi)存并驗(yàn)證,使用后再放回,從而重復(fù)利用數(shù)據(jù)庫(kù)連接資源,這不僅降低了系統(tǒng)資源消耗,還避免了頻繁連接導(dǎo)致的服務(wù)器崩潰和內(nèi)存泄漏風(fēng)險(xiǎn),數(shù)據(jù)庫(kù)連接池在初始化時(shí)創(chuàng)建并保持最小數(shù)量的數(shù)據(jù)庫(kù)連接
    2024-10-10
  • Springboot+MDC+traceId日志中打印唯一traceId

    Springboot+MDC+traceId日志中打印唯一traceId

    本文主要介紹了Springboot+MDC+traceId日志中打印唯一traceId,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • spring boot 監(jiān)聽(tīng)容器啟動(dòng)代碼實(shí)例

    spring boot 監(jiān)聽(tīng)容器啟動(dòng)代碼實(shí)例

    這篇文章主要介紹了spring boot 監(jiān)聽(tīng)容器啟動(dòng)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java 關(guān)鍵字 volatile 的理解與正確使用

    Java 關(guān)鍵字 volatile 的理解與正確使用

    本文主要介紹 volatile 的使用準(zhǔn)則,以及使用過(guò)程中需注意的地方,感興趣的朋友一起看看吧
    2017-06-06
  • Java 替換空格

    Java 替換空格

    本文主要介紹了Java中替換空格的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Spring中的@RestController注解詳細(xì)解析

    Spring中的@RestController注解詳細(xì)解析

    這篇文章主要介紹了Spring中的@RestController注解詳細(xì)解析,@RestController 是 Spring Framework 中的一個(gè)注解,用于標(biāo)識(shí)一個(gè)類為 RESTful Web 服務(wù)的控制器(Controller),處理 HTTP 請(qǐng)求并返回相應(yīng)的數(shù)據(jù),
    2024-01-01
  • 關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    這篇文章主要介紹了關(guān)于JSqlparser使用攻略(高效的SQL解析工具),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Springboot配置suffix指定mvc視圖的后綴方法

    Springboot配置suffix指定mvc視圖的后綴方法

    這篇文章主要介紹了Springboot配置suffix指定mvc視圖的后綴方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

桐梓县| 托里县| 大连市| 黔西县| 海口市| 迭部县| 宜城市| 和田市| 铜陵市| 额敏县| 庆城县| 沾益县| 凤阳县| 兰州市| 瑞安市| 金川县| 冀州市| 乐山市| 桦川县| 文昌市| 名山县| 衡水市| 法库县| 虹口区| 阿拉善右旗| 出国| 苏州市| 平顶山市| 连平县| 凤翔县| 莱芜市| 恩施市| 黎平县| 荔波县| 巨野县| 晋江市| 太白县| 定陶县| 江达县| 南陵县| 南皮县|