亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java注解Annotation與自定義注解詳解

2024-07-14 08:40:10
字體:
來源:轉載
供稿:網友

一:Java注解簡介

開發中經常使用到注解,在項目中也偶爾會見到過自定義注解,今天就來探討一下這個注解是什么鬼,以及注解的應用場景和如何自定義注解。

下面列舉開發中常見的注解

@Override:用于標識該方法繼承自超類, 當父類的方法被刪除或修改了,編譯器會提示錯誤信息(我們最經??吹降膖oString()方法上總能看到這貨)

@Deprecated:表示該類或者該方法已經不推薦使用,已經過期了,如果用戶還是要使用,會生成編譯的警告

@SuppressWarnings:用于忽略的編譯器警告信息

Junit測試:@Test

Spring的一些注解:@Controller、@RequestMapping、@RequestParam、@ResponseBody、@Service、@Component、@Repository、@Resource、@Autowire

Java驗證的注解:@NotNull、@Email

下面看一下注解Override.java的廬山真面目

@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}

二:Java注解基本知識

1. Java注解數據類型

注解是寫在.java文件中,使用@interface作為關鍵字, 所以注解也是Java的一種數據類型,從廣泛的定義來說,Class、Interface、Enum、Annotation都屬于Class類型。

2. Java元注解

在創建注解的時候,需要使用一些注解來描述自己創建的注解,就是寫在@interface上面的那些注解,這些注解被稱為元注解,如在Override中看到的@Target、@Retention等。下面列出一些元注解

@Documented: 用于標記在生成javadoc時是否將注解包含進去,可以看到這個注解和@Override一樣,注解中空空如也,什么東西都沒有

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Documented {}

@Target:用于定義注解可以在什么地方使用,默認可以在任何地方使用,也可以指定使用的范圍,開發中將注解用在類上(如@Controller)、字段上(如@Autowire)、方法上(如@RequestMapping)、方法的參數上(如@RequestParam)等比較常見。

TYPE : 類、接口或enum聲明
FIELD: 域(屬性)聲明
METHOD: 方法聲明
PARAMETER: 參數聲明
CONSTRUCTOR: 構造方法聲明
LOCAL_VARIABLE:局部變量聲明
ANNOTATION_TYPE:注釋類型聲明
PACKAGE: 包聲明

Target.java

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target {  /**   * Returns an array of the kinds of elements an annotation type   * can be applied to.   * @return an array of the kinds of elements an annotation type   * can be applied to   */  ElementType[] value();}
public enum ElementType {  /** Class, interface (including annotation type), or enum declaration */  TYPE,  /** Field declaration (includes enum constants) */  FIELD,  /** Method declaration */  METHOD,  /** Formal parameter declaration */  PARAMETER,  /** Constructor declaration */  CONSTRUCTOR,  /** Local variable declaration */  LOCAL_VARIABLE,  /** Annotation type declaration */  ANNOTATION_TYPE,  /** Package declaration */  PACKAGE,  /** Type parameter declaration */  TYPE_PARAMETER,  /** Use of a type */  TYPE_USE}

@Inherited:允許子類繼承父類中的注解,可以通過反射獲取到父類的注解

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Inherited {}

@Constraint:用于校驗屬性值是否合法

@Documented@Target({ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Constraint {  Class<? extends ConstraintValidator<?, ?>>[] validatedBy();}

@Retention:注解的聲明周期,用于定義注解的存活階段,可以存活在源碼級別、編譯級別(字節碼級別)、運行時級別

SOURCE:源碼級別,注解只存在源碼中,一般用于和編譯器交互,用于檢測代碼。如@Override, @SuppressWarings。

CLASS:字節碼級別,注解存在于源碼和字節碼文件中,主要用于編譯時生成額外的文件,如XML,Java文件等,但運行時無法獲得。 如mybatis生成實體和映射文件,這個級別需要添加JVM加載時候的代理(javaagent),使用代理來動態修改字節碼文件。

RUNTIME:運行時級別,注解存在于源碼、字節碼、java虛擬機中,主要用于運行時,可以使用反射獲取相關的信息。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Retention {  /**   * Returns the retention policy.   * @return the retention policy   */  RetentionPolicy value();}

3. Java注解的內容

在上面的注解源碼中可以看到有的注解中沒有任何內容,有的注解的有內容,看似像方法。

注解的內容的語法格式: 數據類型 屬性名() default 默認值,數據類型用于描述屬性的數據類型,默認值是說當沒有給屬性賦值時使用默認值,一般String使用空字符串”“作為默認值,數組一般使用空數組{ }作為默認值.

下面看一下SpringMVC中的RequestMapping的注解的聲明

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @interface RequestMapping {  String name() default "";  @AliasFor("path")  String[] value() default {};  @AliasFor("value")  String[] path() default {};  RequestMethod[] method() default {};  String[] params() default {};  String[] headers() default {};  String[] consumes() default {};  String[] produces() default {};}

使用SpringMVC中的RequestMapping注解

@RequestMapping(value = "/list",         method = RequestMethod.POST,         produces = {"application/json;charset=UTF-8;"})public String list(){}

4. 注解的使用場景

可以通過注解的聲明周期來分析注解的使用場景:

SOURCE源碼級別:給編譯器使用,如@Override、@Deprecated 等, 這部分開發者應該使用的場景不多

CLASS:字節碼級別,這部分也很少見到

RUNTIME:運行時級別,這個是最多的,幾乎開發者使用到的注解都是運行時級別,運行時注解常用的有以下幾種情況

注解中沒有任何屬性的,空的注解,這部分注解通常起到一個標注的作用,如@Test、@Before、@After,通過獲取這些標記注解在邏輯上做一些特殊的處理

可以使用約束注解@Constraint來對屬性值進行校驗,如@Email, @NotNull等

可以通過在注解中使用屬性來配置一些參數,然后可以使用反射獲取這些參數,這些注解沒有其他特殊的功能,只是簡單的代替xml配置的方式來配置一些參數。使用注解來配置參數這在Spring boot中得到了熱捧,如@Configuration

關于配置方式xml vs annotation, 一般使用xml配置一些和業務關系不太緊密的配置,使用注解配置一些和業務密切相關的參數。

三:Java注解和反射基本API

// 獲取某個類型的注解public <A extends Annotation> A getAnnotation(Class<A> annotationClass);// 獲取所有注解(包括父類中被Inherited修飾的注解)public Annotation[] getAnnotations(); // 獲取聲明的注解(但是不包括父類中被Inherited修飾的注解)public Annotation[] getDeclaredAnnotations();// 判斷某個對象上是否被某個注解進行標注public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)// 獲取某個類聲明的所有字段public Field[] getDeclaredFields() throws SecurityException;// 獲取某個方法public Method getMethod(String name, Class<?>... parameterTypes);

四:自定義注解

使用自定義注解+攔截器或者是AOP等可以進行權限的控制。

下面通過定義一個注解用來限制當用戶訪問接口時必須要登錄的示例

步驟一:定義注解

RequiresLogin.java

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

步驟二:使用注解

@Controller@RequestMapping("/user")public class UserController {  @RequiresLogin  @RequestMapping(value = "/list", produces = {"application/json;charset=UTF-8;"})  public String getUserList(){    System.out.println("--------------");    return "[{'id': 1, 'username':'zhangsan'}]";  }}

步驟三:使用AOP進行攔截,解析注解

public class LoginAdvices {  public void before(JoinPoint joinPoint) throws Exception{    Object target = joinPoint.getTarget();    String methodName = joinPoint.getSignature().getName();    System.out.println(target + "-------" + methodName);    Method method = target.getClass().getMethod(methodName);    boolean annotationPresent = method.isAnnotationPresent(RequiresLogin.class);    if (annotationPresent) {      // 用戶必須登錄      boolean isLogin = false;      if (!isLogin) {        throw new Exception("訪問該接口必須先登錄");      } else {        System.out.println("已登錄...");      }    }  }}

在applicationContext.xml中配置aop

<bean id="loginAdvices" class="com.mengdee.manager.aop.LoginAdvices"/>  <!-- aop配置 -->  <aop:config proxy-target-class="true">    <!--切面 -->    <aop:aspect ref="loginAdvices">      <!-- 切點 -->      <aop:pointcut id="pointcut1" expression="execution(* com.mengdee.manager.controller.*.*(..))"/>      <!--連接通知方法與切點 -->      <aop:before method="before" pointcut-ref="pointcut1"/>    </aop:aspect>  </aop:config>

自定義異常

為什么要自定義異常

Java雖然提供了豐富的異常處理類,但是在項目中還會經常使用自定義異常,其主要原因是Java提供的異常類在某些情況下還是不能滿足各種業務的需求。 例如系統中有些錯誤是符合Java語法,但不符合業務邏輯。如當用戶登錄時賬號不存在或者賬號已鎖定可以自定義一個賬號異常AccountException。

或者有些情況下Java的同一個異??赡軙卸喾N原因引起,在排查問題時不容易定位錯誤,此時可以使用自定義一個更加明確的異常。

自定義異常的好處:自定義異??梢允巩惓8用鞔_,可以隱藏底層的異常,這樣更安全,異常信息更加直觀。

自定義異常的使用:自定義異常一般繼承自Exception或者RuntimeException,根據業務需要可以帶一些屬性作為構造函數的參數,自定義異常需要程序員手動拋出異常,并處理異常。

下面是Apache Shiro中自定義異常的示例

public class ShiroException extends RuntimeException {  public ShiroException() {  }  public ShiroException(String message) {    super(message);  }  public ShiroException(Throwable cause) {    super(cause);  }  public ShiroException(String message, Throwable cause) {    super(message, cause);  }}

以上即是關于Java注解Annotation與自定義注解的詳細說明


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区18| 2020久久国产精品| 精品福利在线看| 欧美体内谢she精2性欧美| 久久91亚洲人成电影网站| 国产精品永久免费视频| 精品高清一区二区三区| 日韩中文av在线| 成人国产精品久久久久久亚洲| 91免费人成网站在线观看18| 色999日韩欧美国产| 亚洲v日韩v综合v精品v| 久久久久久午夜| 日韩av不卡在线| 国产精品自拍偷拍视频| 日韩精品视频中文在线观看| 国产精品久久视频| 国产成人福利网站| 国产在线观看精品一区二区三区| 7m第一福利500精品视频| 亚洲www永久成人夜色| 亚洲第一视频网站| 国产精品色午夜在线观看| 国产精品久久二区| 国产精品极品在线| 亚洲人成77777在线观看网| 中文字幕亚洲欧美日韩在线不卡| 成人免费午夜电影| 成人国产精品久久久| 国产精品老女人精品视频| 日韩一区二区精品视频| 日韩电影中文字幕在线| 国产精品美女午夜av| 一本色道久久88综合日韩精品| 欧美中文在线字幕| 亚洲第五色综合网| 日韩av免费在线观看| 欧美大片在线看| 青草青草久热精品视频在线网站| 91av在线国产| 久久99精品久久久久久噜噜| 国精产品一区一区三区有限在线| 欧美电影在线免费观看网站| 亚洲r级在线观看| 国产精品久久99久久| 2021国产精品视频| 国产一区二区三区视频| 亚洲97在线观看| 一区二区欧美日韩视频| 日韩a**中文字幕| 亚洲男人天堂九九视频| 国产www精品| 亚洲国产精品嫩草影院久久| 日韩三级影视基地| 日韩精品在线观看视频| 91夜夜揉人人捏人人添红杏| 4p变态网欧美系列| 青青青国产精品一区二区| 黑丝美女久久久| 国产精品福利在线观看| 在线日韩欧美视频| 91国产精品电影| 国产精品爱啪在线线免费观看| 97国产精品视频| 国产成人亚洲综合青青| 欧美高清视频免费观看| 精品国产美女在线| 欧美在线视频网| 欧美在线免费视频| 555www成人网| 最近2019中文字幕在线高清| 欧美日韩国产成人| 国产一区二区三区18| 国产精品一区二区久久精品| 91色p视频在线| 亚洲第一天堂av| 国产日韩欧美夫妻视频在线观看| 高清欧美性猛交xxxx黑人猛交| 欧美大片免费观看在线观看网站推荐| 亚洲欧美在线一区二区| 国产精品视频自拍| 在线观看久久久久久| 欧美精品18videosex性欧美| 91丨九色丨国产在线| 国产精品久久久一区| 韩国三级电影久久久久久| 欧美大片欧美激情性色a∨久久| 在线精品国产欧美| 久久国产加勒比精品无码| 欧美精品中文字幕一区| 97视频com| 亚洲精品在线看| 国产精品美腿一区在线看| 中文字幕一精品亚洲无线一区| 亚洲精品久久久久久久久久久久| 久久男人资源视频| 国产欧美日韩高清| 96pao国产成视频永久免费| 欧美日韩激情小视频| 91精品国产自产在线| 国产精品免费观看在线| 伊人久久五月天| 性色av香蕉一区二区| 欧美黄色三级网站| 91久久在线观看| 国产精品福利观看| 精品国产91久久久久久老师| 日韩欧中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 一区二区三区视频免费| 亚洲免费中文字幕| 欧美片一区二区三区| 中文字幕欧美精品在线| 欧美性理论片在线观看片免费| 91精品视频专区| 91精品在线国产| 91欧美精品午夜性色福利在线| 欧美中文字幕在线播放| 亚洲精品一区久久久久久| 国产精品一区二区三区久久久| 亚洲国产高清福利视频| 欧美夫妻性生活视频| 国产精品久久久久91| 91chinesevideo永久地址| 亚洲国产日韩一区| 欧美日韩亚洲一区二区| 中文字幕久久久av一区| 日韩在线观看av| 日韩美女毛茸茸| 北条麻妃在线一区二区| 欧美激情第6页| 91chinesevideo永久地址| 欧美成人中文字幕| 日韩精品免费在线视频| 久久亚洲电影天堂| 欧美高清在线播放| 奇米4444一区二区三区| 欧美精品性视频| 97人洗澡人人免费公开视频碰碰碰| 国产成人avxxxxx在线看| 国产亚洲视频中文字幕视频| 亚洲区中文字幕| 亚洲欧洲在线视频| 国产精品激情自拍| 国产成人在线一区| 日韩av影视在线| 日韩成人中文电影| 日韩中文字幕在线视频播放| 久久九九国产精品怡红院| 亚洲精品99999| 欧美激情一二区| 精品久久久一区二区| 久久久av免费| 亚洲第一在线视频| 136fldh精品导航福利| 日韩资源在线观看| 久久中文久久字幕| 国产一区av在线| 欧美日韩第一页| 久久久久久久成人| 日本在线观看天堂男亚洲| 视频直播国产精品| 亚洲欧美日韩一区在线| 久久精品国产久精国产一老狼|