java annotation注解學習,自定義注解


1Annotation(注解)介紹

Annotation(注解)JDK5.0及以后版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。注解是以'@注解名'在代碼中存在的,根據注解參數的個數,我們可以將注解分為:標記注解、單值注解、完整注解三類。它們都不會直接影響到程序的語義,只是作為注解(標識)存在,我們可以通過反射機制編程實現對這些元數據(用來描述數據的數據)的訪問。另外,你可以在編譯時選擇代碼里的注解是否只存在於源代碼級,或者它也能在class文件中出現。

javaEE經典的SSH框架中(StrtusSpringhibernate),都可以用過使用注解來減少配置,提高系統的靈活性,所以,學習注解,是很有必要的一件事。

2Annotation學習

元注解

元注解也就是注解的注解,Java中提供了四種元注解,專門負責注解其他的注解,分別如下:

@Retention元注解,表示需要在什么級別保存該注釋信息(生命周期)。可選的RetentionPoicy參數包括:
RetentionPolicy.SOURCE:
停留在java源文件,編譯器被丟掉
RetentionPolicy.CLASS
:停留在class文件中,但會被VM丟棄(默認)
RetentionPolicy.RUNTIME
:內存中的字節碼,VM將在運行時也保留注解,因此可以通過反射機制讀取注解的信息

@Target說明了Annotation所修飾的對象范圍:Annotation可被用於 packagestypes(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。
ElementType.CONSTRUCTOR:
構造器聲明
ElementType.FIELD:
成員變量、對象、屬性(包括enum實例)
ElementType.LOCAL_VARIABLE:
局部變量聲明
ElementType.METHOD:
方法聲明
ElementType.PACKAGE:
包聲明
ElementType.PARAMETER:
參數聲明
ElementType.TYPE:
類、接口(包括注解類型)enum聲明

@Documented將注解包含在JavaDoc

@Inheried允許子類繼承父類中的注解

3、自定義注解

下面寫一個自定義的注解,不討論他的實用性,只是學習注解的寫法以及使用

一個枚舉,為注解做數據准備:

package timeng.annotation;

/**

*

* 〈正則表達式規則枚舉〉

* @author timeng

*/

public enum RegexRule {

/**

* email正則表達式規則

*/

EMAIL("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"),

/**

* 數字正則表達式規則

*/

NUMBER("^[0-9]*$");

 

public String value;

 

RegexRule(String value) {

this.value = value;

}

}

定義注解格式:public @interface 注解名 {定義體}

注解參數的可支持數據類型:

1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String
類型
3.Class
類型
4.enum
類型
5.Annotation
類型
6.
以上所有類型的數組

注解:

package timeng.annotation;

 

/**

*

* 〈正則表達式注解〉

* @author timeng

*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

@Inherited

public @interface Regex {

/**

* 正則表達式

* @return

*/

RegexRule regexRule() default RegexRule.NUMBER;

}

注解解析類,非常關鍵

package timeng.annotationparse;

 

/**

*

* 〈注解解析通用類〉

*

* @author timeng

*/

public class AnnotationParseUtil {

public void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException,

InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {

Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});

for (Method method : clazz.getDeclaredMethods()) {

DateFormat df = method.getAnnotation(DateFormat.class);

String name = "";

if (df != null) {

name = df.dateType().value;

method.invoke(obj, name);

}

}

}

/**

*

* 功能描述: <br>

* 〈調用指定類的指定方法,傳參〉

*/

public void parseMethod(Object proxy, Method method, Object[] args) throws IllegalArgumentException,

IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException,

InstantiationException {

// Object obj = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});

Regex df = method.getAnnotation(Regex.class);

String name = "";

if (df != null) {

name = df.regexRule().value;

method.invoke(proxy, args[0], name);

}

}

}

 

使用注解的類

package timeng.test;

 

/**

*

* 〈用例〉

*

* @author timeng

*/

public class UseCase {

/*

* @DateFormat(dateType=DateType.DateOnly) public void formatDate(Date date,String type){ System.out.println(date);

* }

*/

@Regex(regexRule = RegexRule.EMAIL)

public void regexEmail(String unCheckedString, String regexRule) {

boolean rs = Pattern.compile(regexRule).matcher(unCheckedString).find();

// System.out.println(unCheckedString);

// System.out.println(regexRule);

System.out.println(rs);

}

}

測試類

package timeng.test;

 

/**

*

* 〈測試類〉

*

* @author timeng

*/

public class Test {

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException,

InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {

AnnotationParseUtil parse = new AnnotationParseUtil();

// parse.parseMethod(UseCase.class);

Object[] params = new Object[10];

params[0] = "123@qq.com";

UseCase useCase = new UseCase();

parse.parseMethod(useCase, UseCase.class.getDeclaredMethods()[0], params);

}

}

 

運行test類即可看到效果:Test類使用注解,來添加正則表達式的驗證規則,本例驗證了一個郵箱格式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM