日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java注释的理解,java注解原理——记录一下自己的理解

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java注释的理解,java注解原理——记录一下自己的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近因為系統可能要更換成java語言,于是每天都在拼命的研究java的相關知識和框架。之前學習注解的時候,沒有太深入的去理解它,只是覺得標注一下挺好用,但是現在在學到spring aop的時候,突然發現注解的功能是如此強大。不得已,只好仔細來研究一下注解的原理性問題了。

首先,網上有各種介紹注解是運用反射機制,但是我相信很多人其實并不熟練運用反射,當然我這個菜鳥更是如此。但好在反射雖并不常用,但是很好理解。而注解就顯得繞口很多。

言歸正傳,現在開始用我那白的不能再白的大白話跟大家講解一下了(畢竟這個行業總是喜歡搞一些裝逼的高大上的詞匯)。

為了更好的向大家解釋,我還是先貼代碼吧(大家直接copy到自己的IDE上去跑就好)。BusinessLogic.javapackage?annotationTest;

/**?*?@author??kalson

*?@date?創建時間:2017年11月7日?下午1:13:14

*?@version?1.0

*/

public?class?BusinessLogic?{

public?BusinessLogic()?{

super();

}

public?void?compltedMethod()?{

System.out.println("This?method?is?complete");

}

@Todo(priority?=?Todo.Priority.HIGH)

public?void?notYetStartedMethod()?{

//?No?Code?Written?yet

}

@Todo(priority?=?Todo.Priority.MEDIUM,?author?=?"Uday",?status?=?Todo.Status.STARTED)

public?void?incompleteMethod1()?{

//Some?business?logic?is?written

//But?its?not?complete?yet

}

@Todo(priority?=?Todo.Priority.LOW,?status?=?Todo.Status.STARTED?)

public?void?incompleteMethod2()?{

//Some?business?logic?is?written

//But?its?not?complete?yet

}

}

Todo

package?annotationTest;

/**?*?@author??kalson

*?@date?創建時間:2017年11月7日?下午1:12:57

*?@version?1.0

*/

import?java.lang.annotation.ElementType;

import?java.lang.annotation.Retention;

import?java.lang.annotation.RetentionPolicy;

import?java.lang.annotation.Target;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@interface?Todo?{

public?enum?Priority?{LOW,?MEDIUM,?HIGH}

public?enum?Status?{STARTED,?NOT_STARTED}

String?author()?default?"Yash";

Priority?priority()?default?Priority.LOW;

Status?status()?default?Status.NOT_STARTED;

}

TodoReport

package?annotationTest;

/**?*?@author??kalson

*?@date?創建時間:2017年11月7日?下午1:13:27

*?@version?1.0

*/

import?java.lang.reflect.Method;

public?class?TodoReport?{

public?TodoReport()?{

super();

}

public?static?void?main(String[]?args)?{

getTodoReportForBusinessLogic();

}

/**

*?This?method?iterates?through?all?messages?of?BusinessLogic?class?and?fetches?annotations?defined?on?each?of?them.

*?After?that?it?displays?the?information?from?annotation?accordingly.

*/

private?static?void?getTodoReportForBusinessLogic()?{

Class?businessLogicClass?=?BusinessLogic.class;

for(Method?method?:?businessLogicClass.getMethods())?{

Todo?todoAnnotation?=?(Todo)method.getAnnotation(Todo.class);

if(todoAnnotation?!=?null)?{

System.out.println("?Method?Name?:?"?+?method.getName());

System.out.println("?Author?:?"?+?todoAnnotation.author());

System.out.println("?Priority?:?"?+?todoAnnotation.priority());

System.out.println("?Status?:?"?+?todoAnnotation.status());

System.out.println("?---------------------------?");

}

}

}

}

創建了三個類,一個BusinessLogic.java,要被注解的類

一個Todo.java,注解類

一個TodoReport ,測試類。

注解機制最終要的運用了反射機制就是由于如下代碼部分Class?businessLogicClass?=?BusinessLogic.class;

這個Class 的運用想必大家見過但是并沒有認真理解過。所謂的類的類創建,說起來比較拗口,但是我舉一個不恰當的例子。

理念一:假設把克隆當作java中new實例對象的過程,那么這個模型就是我們自己創建的類,但是克隆的原型其實并不是最底層,底層而是細胞,所以如果你想new一個對象,那你就需要先把這個模型new出來,而注解就是作用在這個過程,也就是說,JVM識別注解是在創建模型類的時候就開始識別了。

理念二:其次,需要再跟大家解釋的一個問題就是,套用網上內容Annotations僅僅是元數據,和業務邏輯無關。所以,如果你在學習AOP等各種框架的時候,時刻想著,它的邏輯部分都是框架來實現的,暴露給用戶的都只是一些標志點而已。至于邏輯部分,只好大家發揮腦洞,自己去猜測了。

==========================================================================================

有了上面兩點理念之后,現在我們再來看一下一個用到spring框架的例子。@Aspect???--說明這是一個切面類

public?class?Logging?{

@Pointcut("execution(*?com.yiibai.*.*(..))")//比如說這個注解,

JVM啟動開始創建各種類的類對象的時候,就會識別到這個注解,它的邏輯是什么樣的,由

spring框架來指定(比如說是對com.yiibai.下的所有類的所有方法都用selectAll做標記)。

private?void?selectAll()?{

}

//@Before("@annotation(com.yiibai.Loggable)")

@Before("selectAll()")//比如說識別到Before這個注解的時候,會對selectAll標記的方法前綁定

beforeAdvice方法。這也是由spring框架來做的,所以我們看不到。

public?void?beforeAdvice()?{

System.out.println("going?to?setup?student?profile");

}

@After("selectAll()")

public?void?afterAdvice()?{

System.out.println("Student?profile?has?been?setup.");

}

//@AfterReturning("selectAll()")

public?void?afterReturningAdvice(Object?retval)?{

System.out.println("returing"?+?retval.toString());

}

//@AfterThrowing("selectAll()")

public?void?afterThrowingAdvice(IllegalArgumentException?ex)?{

System.out.println("There?has?been?an?exception:?"?+?ex.toString());

}

}

由于目前只是學習階段,還沒有做對框架的底層研究,所以以上的觀念純屬個人對這方面的抽象理解,希望大家能夠結合自己的知識指正或者希望可以幫助大家理解注解。至于以上注釋中的邏輯,也純屬個人yy的結果。大家感受一下就好

總結

以上是生活随笔為你收集整理的java注释的理解,java注解原理——记录一下自己的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。