亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Java注解使用及原理解析

瀏覽:4日期:2022-08-31 13:28:32

基本特性

1、jdk 1.5之后才引入的。

2、用來說明程序的。(注釋是給程序員看的,注解就是給電腦看的)

java注解的作用分類

1、編寫文檔:通過代碼標識的注解生成文檔。【生成doc文檔】

2、代碼分析:通過代碼標識的注解對代碼進行分析。【使用反射】

3、編譯檢查:通過代碼標識的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查。【override】

測試類:

/** * 我的javadoc測試 */public class TestCode { /** * 計算兩個數(shù)的和 * @param a 整數(shù)a * @param b 整數(shù)b * @return 返回兩個數(shù)的和 */ public int add(int a, int b){ return a+b; }}

對于2、3兩點我們應(yīng)該是知道的。盡管可能不知道里面的原理。但是是平時都在用的。但是對于1點還可以生成doc文檔?

測試操作如下:

D:softjdkbinjavadoc.exe .TestCode.java -encoding utf-8 -docEncoding utf-8 -charset utf-8

生成了一大堆的東西:

Java注解使用及原理解析

打開TestCode.html可以發(fā)現(xiàn),我們的java api手冊就是這樣生產(chǎn)的。

注解來源分類

1、jdk自帶的注解,如常見的override(重寫校驗),deprecated(表示棄用)

2、自定義的注解

1)格式, 以override為例:

Java注解使用及原理解析

2)注解的本質(zhì)

我們編寫一個簡單的注解

MyAnnotation.java

public @interface MyAnnotation {}

我們通過編譯和反編譯看下最終是什么樣的結(jié)果:

D:softjdkbinjavac.exe MyAnnotation.java

D:softjdkbinjavap.exe MyAnnotation.class

結(jié)果如下:

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

}

可以發(fā)現(xiàn)注解的本質(zhì)就是接口,這個接口繼承了jdk里面的Annotation接口。

3)注解的屬性

由于注解本質(zhì)為接口,那么里面可以定義未實現(xiàn)的方法。這些稱為注解的“屬性”。

屬性的返回類型有(返回值不能為void):

基本數(shù)據(jù)類型 String 枚舉 注解 以及以上四種類型的數(shù)組

例子:

public enum Person { PS;}public @interface Annotation2 {}public @interface MyAnnotation { String stringValue(); int integerValue(); Person personValue(); Annotation2 myAnnotationValue(); String[] stringArrayValue();}

屬性的使用,需要注意幾點:

定義了屬性在使用的時候就要給屬性賦值,除非設(shè)置default值。如:String stringValue() default 'aaa'; 如果屬性為value且屬性只有這一個,那么value可以省略,直接填寫屬性值。 如果是數(shù)組,需要用{}包含起來。

public @interface MyAnnotation { String stringValue() default 'xxx'; int integerValue(); String[] stringArrayValue();}public @interface Annotation2 { String value();}@MyAnnotation(integerValue = 1, stringArrayValue = {'aaa', 'bbb'})@Annotation2('default')public class TestCode { /** * 計算兩個數(shù)的和 * @param a 整數(shù)a * @param b 整數(shù)b * @return 返回兩個數(shù)的和 */ public int add(int a, int b){ return a+b; } @Override public String toString() { return super.toString(); }}

元注解

元注解是你在編寫注解的時候,上面加的注解,就是注解的注解。主要有4個。

@target, 用于指定注解的使用位置。如@Target(ElementType.ANNOTATION_TYPE),@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})。 @Inherited,表示父類加了這個注解,子類也自動加上。 @Documented, 表示這個注解的信息在執(zhí)行javadoc的時候是否抽取到api文檔中。 @Retention,表示注解被保留的階段,java類,class文件,以及被jvm讀取。總共三種。RetentionPolicy.SOURCE, RetentionPolicy.CLASS, RetentionPolicy.RUNTIME

元注解的內(nèi)容,可以到j(luò)dk源碼里面看一下,更有利于理解。

解析注解

這個是最關(guān)鍵了,以上加了這么多的屬性,并且還為這些屬性附了值,那么是希望程序讀取這些值,進行使用的。那其實就是要看如何拿到這些注解配置的值。

測試:

MyAnnotition.java:

package annotation_;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation { String stringValue() default 'xxx'; int integerValue();}

TestCode.java:

package annotation_;@MyAnnotation(integerValue = 1)public class TestCode { public static void main(String[] args) { Class<TestCode> testCodeClass = TestCode.class; MyAnnotation myAnnotation = testCodeClass.getAnnotation(MyAnnotation.class); int i = myAnnotation.integerValue(); String s = myAnnotation.stringValue(); System.out.printf('i = %d, s = %sn', i, s); }}

輸出結(jié)果:

Connected to the target VM, address: ’127.0.0.1:49586’, transport: ’socket’i = 1, s = xxxDisconnected from the target VM, address: ’127.0.0.1:49586’, transport: ’socket’

Process finished with exit code 0

是不是感覺可以當配置文件使用。但是最主要的問題是myAnnotation.integerValue(),myAnnotation.stringValue()為什么可以拿到對應(yīng)的值,這個也是最核心的問題。

那就是getAnnotation里面返回了一個實現(xiàn)了MyAnnotation注解(注解的本質(zhì)是接口)的實例。這個類大概是長這樣的。

package annotation_;import java.lang.annotation.Annotation;public class MyAnnotationImpl implements MyAnnotation{ public String stringValue() { return 'xxx'; } public int integerValue() { return 0; } public Class<? extends Annotation> annotationType() { return null; }}

所以就可以通過抽象方法獲取到對應(yīng)的值。(如何生成這樣的一個類,只是學習注解,可以不關(guān)心。要不然,只能看里面的源碼。因為如果自定義注解,你只會用到這一步,去獲取值。)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 免费观看欧美一级特黄 | 欧美一级特黄特黄毛片 | 男女性高爱潮免费网站 | 国产午夜精品一区二区三区不卡 | 中文字幕在线国产 | 亚洲男女视频 | 999热这里只有精品 999热精品这里在线观看 | 亚洲一级片在线观看 | 北条麻妃一区二区三区 | 国产精品一区二区欧美视频 | 一级黄色大片网站 | 欧美黑人粗硬大在线看 | 尤物视频免费在线观看 | 欧美洲精品亚洲精品中文字幕 | 在线观看成年人免费视频 | 亚洲欧美一区二区三区在线观看 | 欧美国产中文 | 久青草国产手机在线观 | 青操在线 | 国产日韩欧美在线 | 国产亚洲精品aa在线看 | 欧美日韩专区国产精品 | 手机看片在线精品观看 | 哪个网站能看毛片 | 久久本道久久综合伊人 | 免费无遮挡十八污污网站 | 中文字幕日韩哦哦哦 | 三片在线观看 | 国产亚洲欧美在线视频 | 青青草久草视频 | 美国aaaa一级毛片啊 | 色婷婷精品视频 | 午夜丁香婷婷 | 国产福利不卡视频在免费 | 国产精品123区 | 一级特黄录像免费播放中文 | 欧美黄色性 | 国产香港三级理论在线 | 一次性a爱片 | 亚洲视频你懂的 | 1024视频在线 |