舉例講解JDK注解的使用和自定義注解的方法
JDK中的三個(gè)基本注解
a、@Override:檢查子類確實(shí)是覆蓋了父類的方法。
b、@Deprecated:說(shuō)明已經(jīng)過(guò)時(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():得到所有的注解,包含從父類繼承下來(lái)的。 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注解。
下面通過(guò)代碼實(shí)現(xiàn)一下。
我們模擬實(shí)現(xiàn)@Test注解的功能
首先這是我們的注解@MyTest
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//元注解: 用來(lái)注解注解的
@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)我們使用了注解,我們就需要判該類是否使用了注解,我們通過(guò)反射來(lái)實(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í)的問(wèn)題,下面我們?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ò)問(wèn)題
相關(guān)文章
淺談Java方法調(diào)用的優(yōu)先級(jí)問(wèn)題
這篇文章主要介紹了淺談Java方法調(diào)用的優(yōu)先級(jí)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問(wèn)題
這篇文章主要介紹了解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
在Windows系統(tǒng)下安裝Thrift的方法與使用講解
今天小編就為大家分享一篇關(guān)于在Windows系統(tǒng)下安裝Thrift的方法與使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
idea中斷點(diǎn)類型之All和Thread的區(qū)別介紹
使用all模式對(duì)于程序中含有多個(gè)線程來(lái)說(shuō),會(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

