詳解java註解相關知識
定義
1、如果註解中有屬性,那麼必須給屬性賦值。
package com.lxc.Test; // 定義一個註解 public @interface Annotation { String name(); // 看似name像一個方法,實際上我們把name稱為屬性 }
使用上邊註解:
package com.lxc.Test; public class Test { @Annotation(name="lxc") public void test() { } }
2、如果註解中有屬性,且沒有定義默認值,那麼在使用註解的時候,必須給屬性賦值。
public @interface Annotation { String name(); int age(); }
public class Test { @Annotation(name="lxc", age=20) public void test() { } }
但是註解中如果有默認值,在使用註解時,可以不給屬性賦值
public class Test { @Annotation(name="lxc") public void test() { } }
public @interface Annotation { String name(); String password() default "123"; }
3、value() 屬性
如果註解中的一個屬性名是value,且有且隻有一個value(),在使用註解的時候,屬性名可以省略
public class Test { @Annotation("lxc") public void test() { } }
public @interface Annotation { String value(); String password() default "123"; }
註解中屬性的類型有哪些
byte、short、int、float、double、boolean、char、String、Class、枚舉
數組:
如果數組屬性中有一個元素,那麼數組的大括號可以省略:
public @interface Annotation { String[] name(); }
public class Test { // @Annotation(name={"lxc"}) // 寫法一 @Annotation(name="lxc") // 寫法二 public void test() { } }
枚舉:
public enum MyEnum { className, name, age, }
public @interface Annotation { String[] name(); MyEnum[] student(); }
public class Test { @Annotation(name="lxc", student = {MyEnum.className, MyEnum.age}) public void test() { } }
註解如何使用:
(1)標記一個註解隻能出現在類或者方法上
@Target(value = {ElementType.TYPE, ElementType.METHOD}) public @interface Annotation { String userName(); MyEnum[] student(); }
(2)標記一個註解可以被反射機制所讀取
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 標記註解隻能出現在類上 @Target(value = {ElementType.TYPE, ElementType.METHOD}) // 標記註解可以被反射機制所讀取 @Retention(RetentionPolicy.RUNTIME) public @interface Annotation { String userName(); MyEnum[] student(); }
獲取註解中的屬性值
通過反射機制來獲取。
(1)獲取類上邊註解的屬性:
註解類:
package com.lxc.Test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 標記註解隻能出現在類上 @Target(value = {ElementType.TYPE, ElementType.METHOD}) // 標記註解可以被反射機制所讀取 @Retention(RetentionPolicy.RUNTIME) public @interface Annotation { String userName() default "呂星辰"; }
使用註解類:
// myAnnotation @Annotation(userName = "哈哈") public class myAnnotation { }
獲取註解類中 的屬性:
package com.lxc.Test; /** * c.isAnnotationPresent(註解類.class) : 判斷一個類上是否有註解,返回true、false * c.getAnnotation(註解類.class) : 獲取註解類的實例 * */ public class Test { public static void main(String[] args) throws Exception{ Class c = Class.forName("com.lxc.Test.myAnnotation"); System.out.println(c.isAnnotationPresent(Annotation.class)); // 判斷一個類是否有:Annotation這個註解 if(c.isAnnotationPresent(Annotation.class)) { // 獲取註解對象 Annotation ann = (Annotation) c.getAnnotation(Annotation.class); // 通過註解對象獲取屬性值 System.out.println(ann.userName()); } } }
(2)獲取類中方法上邊註解的屬性:
註解類:
package com.lxc.Test; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 標記註解隻能出現在類上 @Target(value = {ElementType.TYPE, ElementType.METHOD}) // 標記註解可以被反射機制所讀取 @Retention(RetentionPolicy.RUNTIME) public @interface Annotation { String userName(); String password(); }
在方法上使用註解及獲取方法上邊的註解:
分析:想獲取方法上的註解,首先需要獲取該方法,獲取該方法的前提,獲取該方法的類:
package com.lxc.Test; import java.lang.reflect.Method; public class UserAnnotation { @Annotation(userName = "lxc", password = "123") public void getUser() {} public static void main(String[] args) throws Exception{ // 通過反射獲取類 Class c = Class.forName("com.lxc.Test.UserAnnotation"); // 通過反射獲取類中的方法 Method getUserMethod = c.getDeclaredMethod("getUser"); // 判斷方法是否有 Annotation 這個註解 if(getUserMethod.isAnnotationPresent(Annotation.class)) { Annotation ann = getUserMethod.getAnnotation(Annotation.class); System.out.println(ann.userName()); // lxc System.out.println(ann.password()); // 123 } } }
到此這篇關於詳解java註解的使用的文章就介紹到這瞭,更多相關java註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!