JAVA annotation入门
生活随笔
收集整理的這篇文章主要介紹了
JAVA annotation入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近對spring源碼感興趣,今天看到annotation部分,略記之。
一. 最常見的annotation
package?chb.test.annotation;?? import?java.lang.annotation.Documented;?? 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)?? @Documented?? public?@interface?MyAnnotation1?{?? ????????String?value();?? }?? package chb.test.annotation;
import java.lang.annotation.Documented;
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)
@Documented
public @interface MyAnnotation1 {String value();
}?
2. 有兩個參數的Annotation實現
[java] view plaincopyprint? package?chb.test.annotation;?? import?java.lang.annotation.Documented;?? import?java.lang.annotation.ElementType;?? import?java.lang.annotation.Retention;?? import?java.lang.annotation.RetentionPolicy;?? import?java.lang.annotation.Target;?? @Target(ElementType.METHOD)?? @Retention(RetentionPolicy.RUNTIME)?? @Documented?? public?@interface?MyAnnotation2?{?? ????????String?description();?? ????????boolean?isAnnotation();?? }?? package chb.test.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation2 {String description();boolean isAnnotation();
}?
3. Annotation實驗類
[java] view plaincopyprint? package?chb.test.annotation;?? @MyAnnotation1("this?is?annotation1")?? public?class?AnnotationDemo?{?? ????????@MyAnnotation2(description="this?is?annotation2",isAnnotation=true)?? ????????public?void?sayHello(){?? ????????????????System.out.println("hello?world!");?? ????????}?? }?? package chb.test.annotation;
@MyAnnotation1("this is annotation1")
public class AnnotationDemo {@MyAnnotation2(description="this is annotation2",isAnnotation=true)public void sayHello(){System.out.println("hello world!");}
}?
4.Annotation測試說明類
[java] view plaincopyprint? package?chb.test.annotation;?? import?java.lang.reflect.Method;?? import?org.junit.Test;?? public?class?TestAnnotation?{?? ????????@Test?? ????????public?void?test()?throws?ClassNotFoundException,?SecurityException,?NoSuchMethodException{?? ????????????????Class<?>?cls?=?Class.forName("chb.test.annotation.AnnotationDemo");?? ????????????????boolean?flag?=?cls.isAnnotationPresent(MyAnnotation1.class);?? ????????????????if(flag){?? ????????????????????????System.out.println("判斷類是annotation");?? ????????????????????????MyAnnotation1?annotation1?=?cls.getAnnotation(MyAnnotation1.class);?? ????????????????????????System.out.println(annotation1.value());?? ????????????????}?? ?????????????????? ????????????????Method?method?=?cls.getMethod("sayHello");?? ????????????????flag?=?method.isAnnotationPresent(MyAnnotation2.class)?;?? ????????????????if(flag){?? ????????????????????????System.out.println("判斷方法也是annotation");?? ????????????????????????MyAnnotation2?annotation2?=?method.getAnnotation(MyAnnotation2.class);?? ????????????????????????System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());?? ????????????????}?? ????????}?? ?????????? }?? package chb.test.annotation;
import java.lang.reflect.Method;
import org.junit.Test;
public class TestAnnotation {@Testpublic void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException{Class<?> cls = Class.forName("chb.test.annotation.AnnotationDemo");boolean flag = cls.isAnnotationPresent(MyAnnotation1.class);if(flag){System.out.println("判斷類是annotation");MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class);System.out.println(annotation1.value());}Method method = cls.getMethod("sayHello");flag = method.isAnnotationPresent(MyAnnotation2.class) ;if(flag){System.out.println("判斷方法也是annotation");MyAnnotation2 annotation2 = method.getAnnotation(MyAnnotation2.class);System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());}}}?
實驗結果,控制臺打出如下信息:
判斷類是annotation
this is annotation1
判斷方法也是annotation
this is annotation2 ????true 三.簡介及說明 1. MyAnnotation1中的@Target(ElementType.TYPE) @Target里面的ElementType是用來指定Annotation類型可以用在哪些元素上的.例如: TYPE(類型)、FIELD(屬性)、METHOD(方法)、PARAMETER(參數)、CONSTRUCTOR(構造函數)、LOCAL_VARIABLE(局部變量),、PACKAGE(包),其中的TYPE(類型)是指可以用在Class,Interface,Enum和Annotation類型上。 2. MyAnnotation1中的@Retention(RetentionPolicy.RUNTIME) RetentionPolicy 共有三種策略,分別為:
- @Override:用在方法之上,用來告訴別人這一個方法是改寫父類的
- @Deprecated:建議別人不要使用舊的API的時候用的,編譯的時候會用產生警告信息,可以設定在程序里的所有的元素上.
- @SuppressWarnings:暫時把一些警告信息消息關閉
- @Entity:表示該類是可持久化的類
this is annotation1
判斷方法也是annotation
this is annotation2 ????true 三.簡介及說明 1. MyAnnotation1中的@Target(ElementType.TYPE) @Target里面的ElementType是用來指定Annotation類型可以用在哪些元素上的.例如: TYPE(類型)、FIELD(屬性)、METHOD(方法)、PARAMETER(參數)、CONSTRUCTOR(構造函數)、LOCAL_VARIABLE(局部變量),、PACKAGE(包),其中的TYPE(類型)是指可以用在Class,Interface,Enum和Annotation類型上。 2. MyAnnotation1中的@Retention(RetentionPolicy.RUNTIME) RetentionPolicy 共有三種策略,分別為:
- SOURCE:這個Annotation類型的信息只會保留在程序源碼里,源碼如果經過了編譯之后,Annotation的數據就會消失,并不會保留在編譯好的.class文件里面
- CLASS:這個Annotation類型的信息保留在程序源碼里,同時也會保留在編譯好的.class文件里面,在執行的時候,并不會把這些信息加載到JVM中。注:默認策略為CLASS類型
- RUNTIME:表示在源碼、編譯好的.class文件中保留信息,在執行的時候會把這一些信息加載到JVM中去的
- 訪問權只能用public和默認(default)修飾
- 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String,Enum,Class,annotations等數據類型,以及這一些類型的數組
總結
以上是生活随笔為你收集整理的JAVA annotation入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco 2950 系列交换机实例配置
- 下一篇: 微服务技术栈:流量整形算法,服务熔断与降