舉例講解JDK注解的使用和自定義注解的方法
JDK中的三個(gè)基本注解
a、@Override:檢查子類確實(shí)是覆蓋了父類的方法。
b、@Deprecated:說明已經(jīng)過時(shí)了。
c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的類型。{}數(shù)組。all抑制所有警告。
簡(jiǎn)單使用:
public class Demo1 { //@SuppressWarnings({ "deprecation", "unused" }) @SuppressWarnings("all") public void fun() { int i = 5; System.out.println("hello"); System.out.println(new Date().toLocaleString()); } } class Tests extends Demo1 { @Override public void fun() { super.fun(); } @Deprecated public void tt() { System.out.println(new Date().toLocaleString()); } }
聲明一個(gè)注解 @interface 注解名{}
public @interface MyAnnotation{}
注解它的本質(zhì)就是一個(gè)接口,這個(gè)接口需要繼承 Annotation接口。
public interface MyAnnotation extends java.lang.annotation.Annotation { }
注解的屬性類型:
- 1.基本類型
- 2.String
- 3.枚舉類型
- 4.注解類型
- 5.Class類型
- 6.以上類型的一維數(shù)組類型
具體是怎樣定義的呢,我們看代碼:
public @interface MyAnno1 { //注解中定義的都是屬性 int age() default 20; String[] name() default "hehe"; String value() default "haha"; Love love(); //MyAnno2 anno(); //public static final int num = 5;//可以 //public abstract void fun();//error }
使用自定義注解:
public class Demo2 { //@MyAnno1(age=25,name={"jack","lucy"},value="zhengzhi") //@MyAnno1(value="zhengzhi") @MyAnno1(value="zhengzhi",love=Love.eat) public void tests() { } }
如果在沒有默認(rèn)值的情況下,使用自定義注解我們需要設(shè)置注解中屬性的值。
注解的反射:(靈魂)
模擬Junit的@Test a、反射注解類 java.lang.reflect.AnnotatedElement: <T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定類型的注解引用。沒有返回null。 Annotation[] getAnnotations():得到所有的注解,包含從父類繼承下來的。 Annotation[] getDeclaredAnnotations():得到自己身上的注解。 boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判斷指定的注解有沒有。 Class、Method、Field、Constructor等實(shí)現(xiàn)了AnnotatedElement接口. 如果:Class.isAnnotationPresent(MyTest.class):判斷類上面有沒有@MyTest注解; Method.isAnnotationPresent(MyTest.class):判斷方法上面有沒有@MyTest注解。
下面通過代碼實(shí)現(xiàn)一下。
我們模擬實(shí)現(xiàn)@Test注解的功能
首先這是我們的注解@MyTest
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; //元注解: 用來注解注解的 @Retention(RetentionPolicy.RUNTIME) public @interface MyTest { long timeout() default Integer.MAX_VALUE;//設(shè)置超時(shí)時(shí)間的 }
這是我們使用注解的類:
public class DBCRUD { @MyTest(timeout=1000000) public void addTest() { System.out.println("addTest方法執(zhí)行了"); } @MyTest public void updateTest() { System.out.println("updateTest方法執(zhí)行了"); } }
當(dāng)我們使用了注解,我們就需要判該類是否使用了注解,我們通過反射來實(shí)現(xiàn)。
private static void method1() throws IllegalAccessException, InvocationTargetException, InstantiationException { Class claz = DBCRUD.class;//得到字節(jié)碼文件對(duì)象 //得到該類及父類中的所有方法 Method[] methods = claz.getMethods(); for(Method m:methods){ //判斷方法是否使用了@MyTest這個(gè)注解 // boolean boo = m.isAnnotationPresent(MyTest.class); // System.out.println(m.getName()+"===="+boo);//都是false 默認(rèn)注解存活到 CLASS,改變存活到RUNTIME if(m.isAnnotationPresent(MyTest.class)){ m.invoke(claz.newInstance(), null); } } }
這里我們需要注意的是,我們需要考慮到自定義注解的存活范圍。
默認(rèn)的自定義注解只存活到編譯時(shí)期,class階段。
可以注意到,我們上面的自定義注解應(yīng)用了@Retention注解,這個(gè)注解就是改變自定義注解的存活范圍。
這個(gè)注解也叫做元注解,只能用在注解上的注解叫做元注解。
上面的method方法沒有考慮到超時(shí)的問題,下面我們?cè)偻晟埔幌隆?/p>
//method1(); //反射解析注解的屬性 Class claz = DBCRUD.class; Method[] methods = claz.getMethods(); for(Method m:methods){ //從該方法上獲取MyTest注解 MyTest mt = m.getAnnotation(MyTest.class); if(mt!=null){ //得到注解中的屬性 long out = mt.timeout(); long start = System.nanoTime(); m.invoke(claz.newInstance(), null); long end = System.nanoTime(); if((end-start)>out) { System.out.println("運(yùn)行超時(shí)"); } } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Spring AOP中的JDK和CGLib動(dòng)態(tài)代理哪個(gè)效率更高?
- JDK動(dòng)態(tài)代理與CGLib動(dòng)態(tài)代理的區(qū)別對(duì)比
- Linux centOS安裝JDK和Tomcat的教程
- 淺析JDK和Tomcat的安裝與配置方法
- JAVA JDK8 List獲取屬性列表
- JAVA JDK8 List分組獲取第一個(gè)元素的方法
- JAVA JDK8 List分組的實(shí)現(xiàn)和用法
- Java基于JDK 1.8的LinkedList源碼詳析
- Studio 編譯報(bào)錯(cuò):compileSdkVersion ''android-24'' requires JDK 1.8 or later to compile.的解決辦法
- 解決MyEclipse中Maven設(shè)置jdk版本jdk1.8報(bào)錯(cuò)問題
相關(guān)文章
淺談Java方法調(diào)用的優(yōu)先級(jí)問題
這篇文章主要介紹了淺談Java方法調(diào)用的優(yōu)先級(jí)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問題
這篇文章主要介紹了解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03在Windows系統(tǒng)下安裝Thrift的方法與使用講解
今天小編就為大家分享一篇關(guān)于在Windows系統(tǒng)下安裝Thrift的方法與使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12idea中斷點(diǎn)類型之All和Thread的區(qū)別介紹
使用all模式對(duì)于程序中含有多個(gè)線程來說,會(huì)將多個(gè)線程都阻塞在斷點(diǎn),此時(shí)所有的線程都執(zhí)行到此處,在最后一個(gè)線程執(zhí)行到此處是會(huì)發(fā)生暫停,在這之前的線程會(huì)繼續(xù)執(zhí)行到任意位置,本文給大家詳細(xì)介紹下idea中斷點(diǎn)類型之All和Thread的區(qū)別,感興趣的朋友一起看看吧2022-03-03微信公眾帳號(hào)開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例
本篇文章主要介紹了微信公眾帳號(hào)開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12