电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java注解使用及原理解析

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

基本特性

1、jdk 1.5之后才引入的。

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

java注解的作用分類

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

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

3、編譯檢查:通過代碼標識的注解讓編譯器能夠實現基本的編譯檢查。【override】

測試類:

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

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

測試操作如下:

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

生成了一大堆的東西:

Java注解使用及原理解析

打開TestCode.html可以發現,我們的java api手冊就是這樣生產的。

注解來源分類

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

2、自定義的注解

1)格式, 以override為例:

Java注解使用及原理解析

2)注解的本質

我們編寫一個簡單的注解

MyAnnotation.java

public @interface MyAnnotation {}

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

D:softjdkbinjavac.exe MyAnnotation.java

D:softjdkbinjavap.exe MyAnnotation.class

結果如下:

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

}

可以發現注解的本質就是接口,這個接口繼承了jdk里面的Annotation接口。

3)注解的屬性

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

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

基本數據類型 String 枚舉 注解 以及以上四種類型的數組

例子:

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

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

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

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 { /** * 計算兩個數的和 * @param a 整數a * @param b 整數b * @return 返回兩個數的和 */ 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, 表示這個注解的信息在執行javadoc的時候是否抽取到api文檔中。 @Retention,表示注解被保留的階段,java類,class文件,以及被jvm讀取。總共三種。RetentionPolicy.SOURCE, RetentionPolicy.CLASS, RetentionPolicy.RUNTIME

元注解的內容,可以到jdk源碼里面看一下,更有利于理解。

解析注解

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

測試:

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

輸出結果:

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()為什么可以拿到對應的值,這個也是最核心的問題。

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

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; }}

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 立刷【微电签pos机】-嘉联支付立刷运营中心 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 行星齿轮减速机,减速机厂家,山东减速机-淄博兴江机械制造 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 电销卡_北京电销卡_包月电话卡-豪付网络 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 手术示教系统-数字化手术室系统-林之硕医疗云智能视频平台 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 周口风机|周风风机|河南省周口通用风机厂 | 304不锈钢无缝管_不锈钢管厂家 - 隆达钢业集团有限公司 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? |