一、jdk中常見(jiàn)注解
- @Override :覆蓋父類的方法拷呆。
- @Deprecated : 方法已經(jīng)過(guò)時(shí)翘县,再使用此方法時(shí)代碼上會(huì)出現(xiàn)橫線。
- @SuppressWarnings("deprecated") : 忽略Deprecated 警告市袖,去掉代碼上會(huì)出現(xiàn)的橫線啡直。
二、注解分類(按照運(yùn)行機(jī)制分)
- 1苍碟、源碼注解:注解只在源碼中存在酒觅,編譯成class文件就不存在了。
- 2微峰、編譯時(shí)注解:注解在源碼和class文件中都存在(@Overrid舷丹、@Deprecated、@SuppressWarnings)
- 3蜓肆、運(yùn)行時(shí)注解:在運(yùn)行階段還起作用颜凯,甚至?xí)绊戇\(yùn)行邏輯的注解
按照來(lái)源區(qū)分 - 1谋币、jdk注解
- 2、第三方注解
- 3症概、自定義注解
三蕾额、自定義注解
package com.tiandy.producer;
import java.lang.annotation.*;
//自定義注解
/*
1、使用@interface 關(guān)鍵字定義注解
2彼城、成員以無(wú)參無(wú)異常方式聲明
3诅蝶、可以用default為成員指定一個(gè)默認(rèn)值
4、成員類型是受限的募壕,合法的類型包括原始類型及String调炬、class、Annotation舱馅、Enumeration
5缰泡、如果注解只有一個(gè)成員,則成員名必須取名為value(),在使用時(shí)可以忽略成員名和賦值號(hào)(=)
6代嗤、注解類可以沒(méi)有成員棘钞,沒(méi)有成員的注解稱為標(biāo)識(shí)注解
*/
//元注解,即用在注解上的注解资溃。
//注解的作用域: CONSTRUCTOR:構(gòu)造方法聲明;FIELD:字段聲明;LOCAL_VARIABLE:局部變量聲明;METHOD:方法聲明;
// TYPE:類武翎,接口;PARAMETER:參數(shù)聲明;PACKAGE:包聲明;
@Target({ElementType.METHOD, ElementType.TYPE})
//注解生命周期:SOURCE:只在源碼中顯示,編譯時(shí)會(huì)放棄;CLASS:編譯時(shí)會(huì)記錄到class中溶锭,運(yùn)行時(shí)忽略宝恶;RUNTIME:運(yùn)行時(shí)存在,可以通過(guò)發(fā)射讀取趴捅。
@Retention(RetentionPolicy.RUNTIME)
//允許子類繼承
@Inherited
//生成javadoc會(huì)包含注解信息
@Documented
public @interface Description {
String desc();
String author();
int age() default 18;
}
四垫毙、使用自定義注解
package com.tiandy.producer;
/*
注解使用方法
@<注解名>(<成員名1>="成員值1",成員名2>="成員值2",...)
*/
public class UseDescription {
@Description(desc="I am abc",author="zrh",age=20)
public String abc(){
return "abc";
}
}
五、解析注解
通過(guò)反射獲取類拱绑、函數(shù)或成員上的運(yùn)行時(shí)注解信息综芥,從而實(shí)現(xiàn)動(dòng)態(tài)控制程序運(yùn)行的邏輯。
public class TestDesc {
public static void main(String[] args) {
try {
//使用類加載器加載類
Class cla = Class.forName("com.tiandy.producer.UseDescription");
//找到類上面的注解,參數(shù)為注解對(duì)應(yīng)的class名稱
boolean flag = cla.isAnnotationPresent(Description.class);
if(flag){
Description d = (Description)cla.getAnnotation(Description.class);
System.out.println("desc==="+d.desc());
System.out.println("author===="+d.author());
}
//找到方法的注解
Method[] ms = cla.getMethods();
for (Method m :ms){
boolean temp = m.isAnnotationPresent(Description.class);
if (temp){
Description desc = (Description)m.getAnnotation(Description.class);
System.out.println("desc==="+desc.desc());
System.out.println("author===="+desc.author());
}
}
//另一種解析方法
for(Method m:ms){
//拿到所有的注解
Annotation[] annotations = m.getAnnotations();
for (Annotation a:annotations){
if(a instanceof Description){
Description d = (Description) a;
System.out.println(d.desc());
System.out.println(d.author());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}