溫馨提示×

溫馨提示×

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

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

關(guān)于Java Annotation注解相關(guān)原理的案例

發(fā)布時間:2020-07-08 11:22:17 來源:億速云 閱讀:138 作者:清晨 欄目:開發(fā)技術(shù)

小編給大家分享一下關(guān)于Java Annotation注解相關(guān)原理的案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

Java.lang 中自帶的注解

  • @Override:表示當(dāng)前的方法定義將覆蓋基類的方法。如果你不小心拼寫錯誤,或者方法簽名被錯誤拼寫的時候,編譯器就會發(fā)出錯誤提示。
  • @Deprecated:如果使用該注解的元素被調(diào)用,編譯器就會發(fā)出警告信息。
  • @SuppressWarnings:關(guān)閉不當(dāng)?shù)木幾g器警告信息。
  • @SafeVarargs:在 Java 7 中加入用于禁止對具有泛型varargs參數(shù)的方法或構(gòu)造函數(shù)的調(diào)用方發(fā)出警告。
  • @FunctionalInterface:Java 8 中加入用于表示類型聲明為函數(shù)式接口

如何定義注解

以下是一個為標(biāo)記注解(marker annotation), 不包含任何元素

package cn.haidnor.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
  
}

注解的定義也需要一些元注解(meta-annoation),比如 @Target 和 @Retention。

@Target 定義你的注解可以應(yīng)用在哪里(例如是方法還是字段)。

@Retention 定義了注解在哪里可用,在源代碼中(SOURCE),class文件(CLASS)中或者是在運行時(RUNTIME)。

Demo 簡單實例

定義注解

以下的代碼中。Target 定義只能在方法上使用,Retention 定義保留域

package cn.haidnor.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
  int id();
  String description() default "no description";
}

在類中使用注解

package cn.haidnor.clazz;
package cn.haidnor.clazz;
import cn.haidnor.annotation.UseCase;
import java.util.List;

public class PasswordUtils {
  @UseCase(id = 47, description ="Passwords must contain at least one numeric")
  public boolean validatePassword(String passwd) {
    return (passwd.matches("\\w*\\d\\w*"));
  }
  @UseCase(id = 48)
  public String encryptPassword(String passwd) {
    return new StringBuilder(passwd)
        .reverse().toString();
  }
  @UseCase(id = 49, description = "New passwords can't equal previously used ones")
  public boolean checkForNewPassword(
      List<String> prevPasswords, String passwd) {
    return !prevPasswords.contains(passwd);
  }
}

對以上 demo 中的代碼進(jìn)行測試

package cn.haidnor.test;

import cn.haidnor.annotation.UseCase;
import cn.haidnor.clazz.PasswordUtils;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.*;
import java.lang.reflect.*;

public class UseCaseTracker {

  public static void main(String[] args) {
    List<Integer> useCases = IntStream.range(44, 51)
        .boxed().collect(Collectors.toList());
    trackUseCases(useCases, PasswordUtils.class);
  }

  public static void trackUseCases(List<Integer> useCasesList, Class<&#63;> clazz) {
    // getDeclaredMethods() 獲取所有公開的方法
    for(Method m : clazz.getDeclaredMethods()) {
      // getAnnotation() 獲取指定注解
      UseCase uc = m.getAnnotation(UseCase.class);
      if(uc != null) {
        System.out.print("Found Use Case ");
        // 提取注解元素值
        System.out.println(uc.id());
        // 提取注解元素值
        System.out.println('\t' + uc.description());
        useCasesList.remove( Integer.valueOf( uc.id() ) );
      }
    }

    // 迭代集合
    useCasesList.forEach(new Consumer<Integer>() {
      @Override
      public void accept(Integer integer) {
        System.out.println("Missing use case " + integer);
      }
    });
    // 以上代碼可以使用箭頭行數(shù)簡寫
    // useCasesList.forEach(i -> System.out.println("Missing use case " + i));
  }
}

控制臺輸出結(jié)果

Found Use Case 47
  Passwords must contain at least one numeric
Found Use Case 48
  no description
Found Use Case 49
  New passwords can't equal previously used ones
Missing use case 44
Missing use case 45
Missing use case 46
Missing use case 50

元注解

Java 語言中目前有 5 種標(biāo)準(zhǔn)注解(前面介紹過),以及 5 種元注解。元注解用于注解其他的注解

關(guān)于Java Annotation注解相關(guān)原理的案例

注解中可以使用的元素

所有基本類型(int、float、boolean等)

  • String
  • Class
  • enum
  • Annotation
  • 以上類型的數(shù)組

其他類型,編譯器就會報錯。注意,也不允許使用任何包裝類型

  • 注解的默認(rèn)值
     

無論是在源代碼聲明時還是在注解接口中定義默認(rèn)值時,都不能使用 null 作為其值。

import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SimulatingNull {
  int id() default -1;
  String description() default "";
}

使用反射獲取注解的方法流程圖

關(guān)于Java Annotation注解相關(guān)原理的案例

看完了這篇文章,相信你對關(guān)于Java Annotation注解相關(guān)原理的案例有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI