加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Annotations: Explored & Explained--转载

发布时间:2020-12-14 06:20:36 所属栏目:Java 来源:网络整理
导读:原文地址:http://www.javacodegeeks.com/2012/08/java-annotations-explored-explained.html One of the many wonderful features of Java 5 SE is the introduction of the Annotations construct.Annotations are tags that we can insert into our progr
</table>

02? </tr></table>

03? </tr></table>

04? </tr></table>

05? </tr></table>

06? </tr></table>

07</tr></table>

08</tr></table>

09 </tr></table>

10 </tr></table>

11 </tr></table>

12 </tr></table>

13 </tr></table>

14</tr></table>

15 </tr></table>

16 </tr></table>

17</tr></table>

18?? </tr></table>

19 </tr></table>

20</tr></table>

Note the ‘@’(AT) symbol in front of the ‘interface’ keyword. This is the syntax used to declare an annotation. This is called an?annotation interface. The methods of the interface correspond to the elements of the annotation.?paramName()?– This is the only element our annotation declaration consists of. It stores the name of the annotated field to display it in a message while processing. Note that the declaration looks like a function declaration. Actually,that is what it is.?@interface?actually declares a Java interface whose implementation is provided by the objects that use the annotation. Annotation processors receive the objects that use/implement the annotation and they call annotation interface methods to retrieve the annotation elements. In our case,the?NullValueValidateAnnotationProcessor?would receive the object of the class that has some fields annotated using the?NullValueValidate?annotation. This processor would then call the?paramName()?method to retrieve the value of this annotation element.

We use 3 of the Java provided Annotations to annotate the properties of our declaration. These are alternatively referred to as the?Built-In Annotations?and are used for?‘Annotating an Annotation’. (Well,there are much tougher tongue twisters than this).?@Documented?– Indicates that the annotation declaration has to be included while creating the docs for this project using?JavaDocs. By default,Annotations are excluded from the documentation generated using the?javadocscommand.?@Target?– Indicates the target elements in your java program to which the annotation shall be applied. It can either the Field,Method,Class or the whole Package itself. Our?NullValueValidateannotation shall be applicable to only class fields. Here are the possible values taken by this Enum –

  • TYPE – Applied only to Type. A Type can be a Java class or interface or an Enum or even an Annotation.
  • FIELD – Applied only to Java Fields (Objects,Instance or Static,declared at class level).
  • METHOD – Applied only to methods.
  • PARAMETER – Applied only to method parameters in a method definition.
  • CONSTRUCTOR – Can be applicable only to a constructor of a class.
  • LOCAL_VARIABLE – Can be applicable only to Local variables. (Variables that are declared within a method or a block of code).
  • ANNOTATION_TYPE – Applied only to Annotation Types.
  • PACKAGE – Applicable only to a Package.

@Retention?- Indicates the retention policy to be used for the annotation. In simple words,for long would we retain the annotation. There are three possible values –

  • SOURCE – Annotations are to be discarded by the compiler.
  • CLASS – Annotations are to be recorded in the class file by the compiler but need not be retained by the VM at run time. This is the default behavior.
  • RUNTIME – Annotations are to be recorded in the class file by the compiler and retained by the VM at run time,so they may be read reflectively.

We have set the?RetentionPolicy?to be?RUNTIME?since we plan to process the annotations at runtime of the program.@Target?and?@Retention?are also called Meta-Annotations.Annotation Processing Tool

An annotation processor tool,parses the object it receives and takes programmed actions on finding the annotations it is processing in the object under scrutiny. Here is the annotation processor for our previously declared annotation –NullValueValidate.

01? </tr></table>

02</tr></table>

03? </tr></table>

04? </tr></table>

05? </tr></table>

06</tr></table>

07</tr></table>

08 </tr></table>

09 </tr></table>

10 </tr></table>

11 </tr></table>

12?? </tr></table>

13 </tr></table>

14 </tr></table>

15 </tr></table>

16 </tr></table>

17 </tr></table>

18 </tr></table>

19??? </tr></table>

20? </tr></table>

21 </tr></table>

22</tr></table>

23 </tr></table>

24 </tr></table>

25 </tr></table>

26 </tr></table>

27 </tr></table>

28? </tr></table>

29 </tr></table>

30 </tr></table>

31 </tr></table>

32 </tr></table>

33 </tr></table>

34 </tr></table>

35</tr></table>

36 </tr></table>

37 </tr></table>

38 </tr></table>

39 </tr></table>

40 </tr></table>

41 </tr></table>

42</tr></table>

43 </tr></table>

44 </tr></table>

45 </tr></table>

46 </tr></table>

47 </tr></table>

48 </tr></table>

49 </tr></table>

50 </tr></table>

51?? </tr></table>

52 </tr></table>

53 </tr></table>

54 </tr></table>

55 </tr></table>

56 </tr></table>

57 </tr></table>

58 </tr></table>

59 </tr></table>

60 </tr></table>

61 </tr></table>

62 </tr></table>

63 </tr></table>

64 </tr></table>

65 </tr></table>

66</tr></table>

Most of the code is self explanatory with comments that it has. Please refer the code for detailed understanding of the same. Basically,it has a static method called?processAnnotations?that takes the object of the class which contains annotations that need to be processed. We then use Java Reflection API to process each of the Field in this received object parameter and take necessary actions of null value validation whenever we find a?NullValueValidate?Annotation on the field. If a null value is found,we throw the?NullPointerException?or we print the value on the console.

Annotation UsagePlease refer the following code that uses the?NullValueValidate?annotation that we just implemented. It also uses the?NullValueValidateAnnotationProcessorto process the declared annotations on its field at runtime by calling it from its constructor. Also do note that the annotations are used in a similar fashion as access modifiers like private or public with the variable/field declarations. Usually a newline is entered for better readability of the code. Else,the annotation can very well exist in the same line as the variable/field declaration. The name of the annotation is preceded by an ‘@’(AT) symbol.

01? </tr></table>

02</tr></table>

03? </tr></table>

04? </tr></table>

05</tr></table>

06</tr></table>

07 </tr></table>

08 </tr></table>

09?? </tr></table>

10? </tr></table>

11? </tr></table>

12</tr></table>

13</tr></table>

14? </tr></table>

15 </tr></table>

16?</tr></table>

17 </tr></table>

18 </tr></table>

19 </tr></table>

20 </tr></table>

21?</tr></table>

22??? </tr></table>

23? </tr></table>

24 </tr></table>

25</tr></table>

Output

1</tr></table>

2</tr></table>

3</tr></table>

4? </tr></table>

5? </tr></table>

6 </tr></table>

7 </tr></table>

8 </tr></table>

9 </tr></table>

Conclusion

I had a lot of fun doing this sample annotation program and now I have implemented many custom made Annotations to load properties from property files,validations of database field lengths,etc. Annotations greatly reduces the verbosity of the code thus making it much simpler and readable. Annotations can be used for logging,generating code dependent deployment descriptors and other mechanical and repetitive jobs. I had a lot of fun compiling this article for you guys. I hope you benefit from it.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

原文地址:http://www.javacodegeeks.com/2012/08/java-annotations-explored-explained.html

One of the many wonderful features of Java 5 SE is the introduction of the Annotations construct.Annotations are tags that we can insert into our program source code for some tool to process it and make sense out of it. Annotations processing tools generally use Reflection API (of Java 5 SE) to process the code at source level on Java code or bytecode level to process the class files into which the compiler has placed the annotations. Java Annotations are wonderfully explained in many places around the web,but the only place where I could find a sensible and complete example was a hard bound book by Prentice Hall Publications named Core Java : Volume II – Advanced Features,authored by Cay S. Horstmann and Gary Cornell.

Almost all the places on web that try to explain Annotations miss the most crucial part of showing us an Annotation Processing Tool (APT) for our custom written annotations and the way to use it from our code. I have used the information from the book to build some Annotations for validating variables and initializing values in them from property files for my project. My observation of the lack of examples over the www for writing custom Java Annotations has motivated me to write this article. So,presenting to you a sample custom Java Annotation to help you write your own Annotations for whatever it is you may be doing. ? ? ? ? ?

I will take you through the?NullValueValidate?annotation whose purpose as its name suggests is to validate the variable it annotates to be containing a non null value. If it finds a null value while processing then it will throw aNullPointerException.Declaring an Annotation

Lets begin by declaring our annotation. This declaration will be used by the code that intends to use the annotation to annotate the variables in its object.

01? </tr>