久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

Java中怎么使用自定義注解

本篇文章為大家展示了Java中怎么使用自定義注解,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創新互聯公司是一家專業提供岳塘企業網站建設,專注與做網站、成都網站建設、H5高端網站建設、小程序制作等業務。10年已為岳塘眾多企業、政府機構等服務。創新互聯專業網站制作公司優惠進行中。

一. 什么是注解(Annotation)

Java注解是什么,以下是引用自維基百科的內容

Java注解又稱Java標注,是JDK5.0版本開始支持加入源代碼的特殊語法元數據。

Java語言中的類、方法、變量、參數和包等都可以被標注。和Javadoc不同,Java標注可以通過反射獲取標注內容。在編譯器生成類文件時,標注可以被嵌入到字節碼中。Java虛擬機可以保留標注內容,在運行時可以獲取到標注內容。當然它也支持自定義Java標注。

 

二. 注解體系圖

元注解:java.lang.annotation中提供了元注解,可以使用這些注解來定義自己的注解。主要使用的是Target和Retention注解

注解處理類:既然上面定義了注解,那得有辦法拿到我們定義的注解啊。java.lang.reflect.AnnotationElement接口則提供了該功能。注解的處理是通過java反射來處理的。

因此,只要我們通過反射拿到Class, Method, Field類,就能夠通過getAnnotation(Class<T>)拿到我們想要的注解并取值。

搜索Java知音公眾號,回復“后端面試”,送你一份Java面試題寶典

 

三. 常用元注解

Target:描述了注解修飾的對象范圍,取值在java.lang.annotation.ElementType定義,常用的包括:

  • METHOD:用于描述方法
  • PACKAGE:用于描述包
  • PARAMETER:用于描述方法變量
  • TYPE:用于描述類、接口或enum類型

Retention: 表示注解保留時間長短。取值在java.lang.annotation.RetentionPolicy中,取值為:

  • SOURCE:在源文件中有效,編譯過程中會被忽略
  • CLASS:隨源文件一起編譯在class文件中,運行時忽略
  • RUNTIME:在運行時有效

只有定義為RetentionPolicy.RUNTIME時,我們才能通過注解反射獲取到注解。

所以,假設我們要自定義一個注解,它用在字段上,并且可以通過反射獲取到,功能是用來描述字段的長度和作用。

@Target(ElementType.FIELD)  //  注解用于字段上
@Retention(RetentionPolicy.RUNTIME)  // 保留到運行時,可通過注解獲取
public @interface MyField {
    String description();
    int length();
}
   

四. 示例-反射獲取注解

先定義一個注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyField {
    String description();
    int length();
}
 

通過反射獲取注解

public class MyFieldTest {

    //使用我們的自定義注解
    @MyField(description = "用戶名", length = 12)
    private String username;

    @Test
    public void testMyField(){

        // 獲取類模板
        Class c = MyFieldTest.class;

        // 獲取所有字段
        for(Field f : c.getDeclaredFields()){
            // 判斷這個字段是否有MyField注解
            if(f.isAnnotationPresent(MyField.class)){
                MyField annotation = f.getAnnotation(MyField.class);
                System.out.println("字段:[" + f.getName() + "], 描述:[" + annotation.description() + "], 長度:[" + annotation.length() +"]");
            }
        }

    }
}
   

應用場景一:自定義注解+攔截器 實現登錄校驗

接下來,我們使用springboot攔截器實現這樣一個功能,如果方法上加了@LoginRequired,則提示用戶該接口需要登錄才能訪問,否則不需要登錄。

首先定義一個LoginRequired注解

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

然后寫兩個簡單的接口,訪問sourceA,sourceB資源

@RestController
public class IndexController {

    @GetMapping("/sourceA")
    public String sourceA(){
        return "你正在訪問sourceA資源";
    }

    @GetMapping("/sourceB")
    public String sourceB(){
        return "你正在訪問sourceB資源";
    }

}

實現spring的HandlerInterceptor 類先實現攔截器,但不攔截,只是簡單打印日志,如下:

public class SourceAccessInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("進入攔截器了");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
 

實現spring類WebMvcConfigurer,創建配置類把攔截器添加到攔截器鏈中

@Configuration
public class InterceptorTrainConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SourceAccessInterceptor()).addPathPatterns("/**");
    }
}

在sourceB方法上添加我們的登錄注解@LoginRequired

@RestController
public class IndexController {

    @GetMapping("/sourceA")
    public String sourceA(){
        return "你正在訪問sourceA資源";
    }

    @LoginRequired
    @GetMapping("/sourceB")
    public String sourceB(){
        return "你正在訪問sourceB資源";
    }

}
 

簡單實現登錄攔截邏輯

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("進入攔截器了");

        // 反射獲取方法上的LoginRequred注解
        HandlerMethod handlerMethod = (HandlerMethod)handler;
        LoginRequired loginRequired = handlerMethod.getMethod().getAnnotation(LoginRequired.class);
        if(loginRequired == null){
            return true;
        }

        // 有LoginRequired注解說明需要登錄,提示用戶登錄
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().print("你訪問的資源需要登錄");
        return false;
    }

運行成功,訪問sourceB時需要登錄了,訪問sourceA則不用登錄

應用場景二:自定義注解+AOP 實現日志打印

先導入切面需要的依賴包

<dependency>
      <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
 

定義一個注解@MyLog

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

定義一個切面類,見如下代碼注釋理解:

@Aspect // 1.表明這是一個切面類
@Component
public class MyLogAspect {

    // 2. PointCut表示這是一個切點,@annotation表示這個切點切到一個注解上,后面帶該注解的全類名
    // 切面最主要的就是切點,所有的故事都圍繞切點發生
    // logPointCut()代表切點名稱
    @Pointcut("@annotation(me.zebin.demo.annotationdemo.aoplog.MyLog)")
    public void logPointCut(){};

    // 3. 環繞通知
    @Around("logPointCut()")
    public void logAround(ProceedingJoinPoint joinPoint){
        // 獲取方法名稱
        String methodName = joinPoint.getSignature().getName();
        // 獲取入參
        Object[] param = joinPoint.getArgs();

        StringBuilder sb = new StringBuilder();
        for(Object o : param){
            sb.append(o + "; ");
        }
        System.out.println("進入[" + methodName + "]方法,參數為:" + sb.toString());

        // 繼續執行方法
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println(methodName + "方法執行結束");

    }
}
 

在步驟二中的IndexController寫一個sourceC進行測試,加上我們的自定義注解:

    @MyLog
    @GetMapping("/sourceC/{source_name}")
    public String sourceC(@PathVariable("source_name") String sourceName){
        return "你正在訪問sourceC資源";
    }

上述內容就是Java中怎么使用自定義注解,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。

當前名稱:Java中怎么使用自定義注解
網站地址:http://www.js-pz168.com/article42/jhhjhc.html

成都網站建設公司_創新互聯,為您提供響應式網站定制開發網頁設計公司外貿網站建設定制網站網站導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
欧美视频精品在线观看| 欧美国产视频在线| 国产精品久久久久久久久晋中 | 91美女精品福利| 日韩hmxxxx| 91精品国模一区二区三区| 国产精品免费丝袜| 日本aⅴ精品一区二区三区| 99精品热视频| 亚洲v日韩v欧美v综合| 91麻豆精品国产91久久久资源速度| 国产精品婷婷午夜在线观看| 日本女优在线视频一区二区| 91一区在线观看| 中文字幕一区二区三区乱码| 337p粉嫩大胆噜噜噜噜噜91av | 美日韩一区二区三区| 91日韩久久| 一本一道久久a久久精品| 亚洲精品一区二区在线观看| 亚洲成人av电影在线| av资源网一区| 亚洲一区二区高清视频| 久久综合九色综合97婷婷| 偷拍一区二区三区四区| 91美女在线视频| 色狠狠色狠狠综合| 中文字幕av在线一区二区三区| 裸体健美xxxx欧美裸体表演| 国产精品加勒比| 欧美精品日韩精品| 一区二区三区中文字幕精品精品 | 天天做天天摸天天爽国产一区 | 久久精品久久精品| 精品一区二区日本| 欧美一区二区二区| 亚洲成av人片在www色猫咪| 91丨porny丨国产| 在线亚洲一区观看| 亚洲欧洲日韩在线| 丁香另类激情小说| 宅男噜噜99国产精品观看免费| 国产婷婷一区二区| 国产美女主播视频一区| 午夜精品一区二区在线观看| 国产亚洲精品超碰| 国产精品综合一区二区三区| 色一情一乱一伦一区二区三欧美 | 欧美日韩成人一区二区| 亚洲永久免费视频| 97神马电影| 91麻豆精品国产91久久久久久| 亚洲午夜一区二区| 国产精品伊人日日| 欧美成人高清电影在线| 久久精品国产网站| 色综合久久av| 中文字幕一区二区三中文字幕| 丁香啪啪综合成人亚洲小说 | 另类成人小视频在线| 人偷久久久久久久偷女厕| 国产偷国产偷亚洲高清人白洁| 国产精品1区2区3区在线观看| 在线观看日韩片| 亚洲美女视频在线| 高清视频一区| 精品欧美一区二区三区精品久久| 久久国产精品99精品国产| 日韩欧美亚洲在线| 中文字幕一区二区不卡| 3d动漫啪啪精品一区二区免费| 51精品国自产在线| 久久国产精品色| 色综合一区二区| 亚洲一级不卡视频| 久久免费看av| 中文字幕av一区二区三区高| www.成人在线| 日韩欧美国产精品| 国产精品一区二区免费不卡 | 免费观看成人高| 国产精品你懂的| 91一区二区三区| 久久嫩草精品久久久久| 国产不卡视频在线观看| 欧美日韩国产乱码电影| 美腿丝袜一区二区三区| 色综合天天综合色综合av| 亚洲va天堂va国产va久| 日韩精品第一页| 亚洲黄色av一区| 看高清中日韩色视频| 中文字幕一区二区三区四区| 爱情岛论坛亚洲入口| 国产日韩欧美精品在线| 97精品国产露脸对白| 久久网这里都是精品| 97久久人人超碰| 久久久久久久久岛国免费| 91在线观看地址| 久久婷婷国产综合精品青草| av一二三不卡影片| 久久婷婷国产综合精品青草 | 另类小说一区二区三区| 欧美三级一区二区| 激情综合色丁香一区二区| 欧美日韩免费观看一区二区三区 | 99久久久免费精品国产一区二区| 精品久久一区二区三区| 91在线国产福利| 国产日韩亚洲欧美综合| 翡翠波斯猫1977年美国| 国产精品高潮久久久久无| 久久av一区二区三区亚洲| 亚洲精品免费电影| 日韩欧美精品一区二区三区经典 | 久久九九久精品国产免费直播| 91热门视频在线观看| 欧美激情一区二区三区全黄| 国产伦精品一区二区三区高清版 | 亚洲a一区二区| 色婷婷av一区二区三区之一色屋| 美女视频第一区二区三区免费观看网站| 日本韩国欧美在线| 黑人精品欧美一区二区蜜桃| 欧美美女bb生活片| 国产69精品久久99不卡| 欧美不卡视频一区| av一区二区三区免费| 亚洲私人影院在线观看| 日本一区二区在线视频| 日韩一区精品字幕| 欧美猛男超大videosgay| 成人国产在线观看| 中文天堂在线一区| 日本一区二区三区四区高清视频| 丝袜亚洲另类欧美| 欧美嫩在线观看| 99久久精品免费| 《视频一区视频二区| 亚洲欧美日韩国产成人综合一二三区| 蜜桃视频第一区免费观看| 在线综合视频播放| 99国内精品久久久久久久软件| 亚洲三级小视频| 色诱视频网站一区| 国产成人在线视频网址| 国产欧美一区二区在线| 欧美激情论坛| 理论电影国产精品| 精品国产区一区| 麻豆成人小视频| 日本aⅴ精品一区二区三区| 欧美一区二区久久| 国产综合18久久久久久| 图片区日韩欧美亚洲| 日韩一级片在线观看| 国产精品白丝jk白祙| 亚洲aⅴ怡春院| 91精品国产福利在线观看| 国产 高清 精品 在线 a| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩久久一区| 99久久国产免费免费| 亚洲高清一区二区三区| 欧美一区二区黄| 精品一区二区国产| 久久精品国产久精国产爱| 久久久一区二区三区捆绑**| 日本一区视频在线播放| 国产一区二区不卡在线 | 欧美片网站yy| 成人动漫在线观看视频| 午夜激情一区二区三区| 欧美成人官网二区| 欧美一区少妇| 国产高清无密码一区二区三区| 国产精品沙发午睡系列990531| 中文网丁香综合网| 99国产精品国产精品毛片| 亚洲午夜免费视频| 欧美zozozo| 亚洲国产日韩欧美| 99久久综合色| 午夜视频一区二区| 日韩欧美高清一区| 天天综合色天天综合色hd| 粗大黑人巨茎大战欧美成人| 亚洲久草在线视频| 欧美一区二区成人| 日韩久久久久久久久久久久久| 成人性色生活片| 亚洲第一福利一区| 久久久三级国产网站| 色偷偷久久一区二区三区| 51国产成人精品午夜福中文下载| 日本成人在线看| 国产精品亲子伦对白| 欧美人成免费网站| 日本一区二区在线视频|