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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java注解原来如此通俗易懂

發布時間:2024/10/14 java 93 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java注解原来如此通俗易懂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:
1.注解概述
2.注解的作用分析
3.JDK中預定義的一些注解
4.自定義注解
5.元注解
6.解析注解

1.注解概述

Java注解是一系列元數據,它提供數據用來解釋程序代碼,它是JDK1.5之后版本引入的新的特性,與類,接口,枚舉是同一個層次,它可以聲明在包,類,字段,方法,局部變量,方法參數等的前面,用來說明程序的,注解并非是所解釋的代碼本身的一部分。注解對于代碼的運行效果沒有直接影響

2.注解的作用分析

簡單了解注解的作用:

注解作用:
1.編譯檢查:通過代碼里標識的注解據讓編譯器實現基本的檢查
2.編寫文檔:通過代碼里標識的注解生成文檔【doc文檔】
3.代碼分析:通過代碼標識的注解對代碼進行分析【使用反射】

1.編譯檢查
就比如我們接觸過的Override注解:
Override注解作用是檢查所注解方法是否重寫了父類的方法,如果不是注解的正確使用,編譯就不會通過,這就是所謂的注解檢查:

2.編寫文檔
就是我們在文檔注釋上加一點注解:

package annotation; /*** 計算兩數的和* @author itcat* @version 1.0* @since 1.5*/ public class AnnoDemo1 { /*** 計算兩數的和* @param a 整數* @param b 整數*/ public int add(int a,int b) {return a+b; } }

然后如果我們把上邊代碼編寫成文檔那么注解的內容將會被翻譯成文檔中相應的內容
ps:博主不知道為啥不能生成文檔所以不能演示生成文檔后,文檔里邊的內容,mmp這文檔肯定看不起我

當然其實只要了解到它會在生成文檔中會被翻譯成對應信息就行

3.代碼分析:通過代碼標識的注解對代碼進行分析【使用反射】,在下面詳細說明

3.JDK預定義的注解

1.@Override:檢查被注解的方法是否是繼承自父類的
2.@Deprecated:將該注解標注的內容已經過時
3.@Suppresswarnings:壓制警告

1.@Override:這個不多講,上邊的演示有
2.@Deprecated
例子:

我們可以看到當我們選擇方法時,show1上是有一個刪除線的,而show2是沒有的,這就是本注解的作用,雖然注解內容已經過時但是不影響我們對它的調用,java中標注這個注解說明該方法已經存在更好的方法進行替換

3.@Suppresswarnings
例子:

乍一看好像沒啥啊,但是可以把鼠標放在紅色嘆號下邊的黃色橫杠上,就會出現提示信息,上圖就有一個Method 'show2()' is never used這個警告信息,如果不想要這些警告,那么就可以在你不想要的警告的方法上添加此注解,就會屏蔽。這個注解一般加在類上邊的部分,這樣就能屏蔽全部的警告

注意使用此注解一般需要加一個參數all,正確格式為@Suppresswarnings("all")

4.自定義注解

1.我們看一個系統自定義注解Override的注解格式分析:

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

格式:

1.元注解:下邊會講
2.public @interface 注解名稱{}:一個類似于普通接口的接口,作用和使用規則和普通方法一樣

注解本質:

所有注解都會繼承得的公共接口,系統默認為你繼承java.lang.annotation.Annotation接口

注解屬性:

就是注解的接口里邊可以定義的成員方法
要求:
1.屬性的返回值類型:
(1)基本數據類型
(2)String
(3)注解
(4)以上類型的數組
2.定義屬性后:
(1)使用時需要給屬性賦值
(2)如果定義屬性時使用default關鍵字給屬性默認初始化值,則使用注解時,可以不進行屬性的賦值
(3)數組賦值的時候使用{}包裹,如果數組只有一個元素{}可以省略,如果只有一個屬性需要賦值,并且屬性的名稱是value那么賦值時value可以直接省略

為了方便理解舉個例子(對屬性返回值類型的要求):

很明顯void不合適(編譯不通過),注意我們把注解里邊的方法叫做屬性

接下來我們看看定義屬性后的對屬性進行賦值的案例:

package annotation; public @interface AnnoDemo1 {int age();String str(); }@AnnoDemo1(age=12,str="張三") class person{int a;void fly(){System.out.println("我要飛的更高,摔的更慘");}public static void main(String[] args) {new person().fly();} }

很好奇是不是為啥方法會等于一個值,回答是java規定的,懂了嗎,你定義的方法必須要在使用的時候為方法賦值,否則編譯不通過當然不包括default

下面是對default和value這個特殊名稱的使用,str默認值是李四,不使用默認值的話就必須用注釋的部分進行賦值:

package annotation; public @interface AnnoDemo1 {int value();String str() default "李四"; } @AnnoDemo1(12) //@AnnoDemo1(value = 12,str="王五") class person{int a;void fly(){System.out.println("我要飛的更高,摔的更慘");}public static void main(String[] args) {new person().fly();} }

當我們賦一些特殊的值:

package annotation; public @interface AnnoDemo1 {MyEnum p();String[] str() ;Override over(); } @AnnoDemo1(p=MyEnum.p1,str={"123","234"},over = @Override) class person{int a;void fly(){System.out.println("我要飛的更高,摔的更慘");}public static void main(String[] args) {new person().fly();} }

附帶枚舉的代碼:

package annotation; public enum MyEnum {p1,p2; }

5.元注解

我們再把Override的源碼拿來分析:

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

簡單的說元注解就是描述注解的注解,比如上邊的 @Target和@Retention

元注解是Java中定義好的注解,常用元注解:

注解名注解作用
@Target描述注解能夠作用的位置
@Retention描述注解被保留的階段
@Documented描述注解能否被抽取到api文檔中
@Inherited描述注解是否被子類繼承

1.@Target
源碼:

@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(); }

我們打開 ElementType源碼:

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** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE }

發現是一個枚舉類型的數據,我們了解枚舉的三個取值:

(1)TYPE:可以作用于類上
(2)METHOD:可以作用于方法上
(3)FIELD:可以作用于成員變量上
ps:注意value可以省略不寫因為只有它一個需要賦值的


看到那個報錯的小紅燈泡沒,就是因為你用它修飾方法

2.@Retention
源碼:

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

打開RetentionPolicy 源碼:

public enum RetentionPolicy {/*** Annotations are to be discarded by the compiler.*/SOURCE,/*** Annotations are to be recorded in the class file by the compiler* but need not be retained by the VM at run time. This is the default* behavior.*/CLASS,/*** Annotations are to be recorded in the class file by the compiler and* retained by the VM at run time, so they may be read reflectively.** @see java.lang.reflect.AnnotatedElement*/RUNTIME }

也是枚舉類型:

1.SOURCE:源碼階段
2. CLASS:類對象階段
3. RUNTIME:運行時階段
一般參數是RUNTIME,意思是當前被描述的注解會保留到class字節碼文件中,并被JVM讀取到
如果參數是CLASS意思是當前被描述的注解會保留到class字節碼文件中,但不會被JVM讀取到
如果參數是SOURCE意思是當前被描述的注解不會保留到class文件里

3.@Documented
就是描述此方法或其它的注解會被抽取到api文檔里邊:

畫紅線得到部分就是由于@Documented注解才使得劃線所代表注保留到了api文檔中

4.@Inherited
很好理解,如果父類的注解包含@Inherited那么子類即使不加注解也會默認含有該注解

6.解析注解

那么什么是解析注解:即獲取注解中定義的屬性值

package untl2; import java.lang.reflect.Method; @pro(MethodName ="fly") public class MyReflect {public int a=12;public void fly(){System.out.println("我要飛的更高");}public static void main(String[] args) throws Exception {Class cls=MyReflect.class;//其實就是在內存中生成了一個注解接口的子類實現類對象pro an=(pro) cls.getAnnotation(pro.class);String method=an.MethodName();Object obj=cls.newInstance();Method method1=cls.getMethod(method);method1.invoke(obj);} }運行結果: 我要飛的更高

其實以上代碼等同:

package untl2; import java.lang.reflect.Method; @pro(MethodName ="fly") public class MyReflect {public int a=12;public void fly(){System.out.println("我要飛的更高");}public static void main(String[] args) throws Exception {Class cls=MyReflect.class;//其實就是在內存中生成了一個注解接口的子類實現類對象Object obj=cls.newInstance();Method method1=cls.getMethod("fly");method1.invoke(obj);} } 運行結果: 我要飛的更高

pro注解的定義代碼:

package untl2; 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 pro {String MethodName(); }

getAnnotation是獲得注解的Class對象方法,然后就可以通過.方法名拿到我們需要的注解里邊的屬性值。

一般來說我們主要替換配置文件的時候用的注解比較多

總結

以上是生活随笔為你收集整理的Java注解原来如此通俗易懂的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 99久久久| 国产一国产二国产三 | 69sese| 69久久久久久 | 五月天婷婷综合网 | 午夜精品久久久久久久91蜜桃 | 69久久夜色精品国产69 | 91视频青青草 | 日韩av无码中文字幕 | 久草免费资源站 | 亚洲无毛视频 | 国产精品111 | 国产成人精品777777 | 丰满肉嫩西川结衣av | 黄色美女视频网站 | av嫩草| 午夜激情在线观看视频 | 一区二区三区国产精品视频 | 18禁男女爽爽爽午夜网站免费 | 好屌妞视频这里只有精品 | 亚洲视频中文字幕 | 在线欧美成人 | 日韩视频在线免费观看 | 黄色免费视频观看 | 精品国产成人亚洲午夜福利 | 四虎永久免费在线观看 | 国产av天堂无码一区二区三区 | 又色又爽又黄gif动态图 | 日本少妇与黑人 | 欧洲一级片 | 日本妇乱大交xxxxx | 国产福利一区在线 | 久久爰| 九九综合视频 | 夜色88v精品国产亚洲 | 69er小视频 | 性感美女一级片 | 美女免费福利视频 | 欧美无人区码suv | 韩国成人免费视频 | 久久亚洲一区二区 | 一久久久 | 欧美乱子伦 | 欧美亚韩一区二区三区 | 成片在线观看 | 福利资源导航 | 久久福利在线 | 欧日韩一区二区三区 | 噜噜色图| 日本精品一区二区三区在线观看 | 牛牛澡牛牛爽一区二区 | 国产寡妇色xxⅹ交肉视频 | 亚洲性图一区二区三区 | 女人扒开腿让男人捅爽 | 亚洲黄站 | 国产激情无套内精对白视频 | 国产精品国产成人国产三级 | 午夜一区二区三区在线 | 苍井空张开腿实干12次 | 久久久久久91香蕉国产 | 午夜天堂视频 | 在线观看涩涩视频 | 国产精品亚洲αv天堂无码 伊人性视频 | 国产精品午夜一区二区 | 国产夜夜爽| 亚洲网站在线免费观看 | av天天看| 四色在线 | 污污网站免费 | 亚洲欧洲综合在线 | 国产精品污www一区二区三区 | 麻豆综合网 | 精品国产一区二区视频 | 久久国产香蕉视频 | 国产深夜福利 | 男人添女人荫蒂国产 | 亚洲天堂久久新 | 日韩欧美国产激情 | 成人在线观看小视频 | 国产视频一区二区不卡 | 成人高潮片免费 | 日本理论中文字幕 | 国产性猛交xxxⅹ交酡全过程 | 四虎永久地址 | 三级a毛片| 久久受 | 少妇太爽了在线观看 | 亚洲激情av在线 | 久久爱网 | 日韩性xxx| 免费一级大片 | 久久人人干 | 日韩操比| 久久久麻豆 | 末路1997全集免费观看完整版 | 日韩不卡av| 在线观看免费 | 久久精品视频一区 | 欧美裸体按摩 |