Java – Annotations

1,268 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,268
On SlideShare
0
From Embeds
0
Number of Embeds
88
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Java – Annotations

  1. 1. Java – Annotations Anotace v Javě Martin Majliš
  2. 2. Cíl <ul><li>Spojit dodatečnou informaci s elementem programu
  3. 3. Snadnější údržba </li><ul><li>Kód se dá generovat
  4. 4. Kontrola chyb </li></ul><li>Mnohá API potřebují dodatečné soubory (Spring, hibernate, EJB 3, Seam, JAX-RPC) </li></ul>
  5. 5. Ukázka class A { @Override public boolean equals ( A a ) { ... } @Deprecated public void myDeprecatedMethod () { ... } } <ul><li>Kompilátor: ”method does not override or implement a method from a supertype”
  6. 6. Kompilátor: &quot;The method myDeprecatedMethod() from the type A is deprecated.&quot; </li></ul>
  7. 7. Historie <ul><li>JSR-175 </li><ul><li>Představeno: 1. 4. 2002
  8. 8. Finální verze: 30. 9. 2004
  9. 9. http://www.jcp.org/en/jsr/detail?id=175 </li></ul><li>Poprvé v JDK 1.5
  10. 10. Provizorní rozhraní pro apt v JDK 1.5
  11. 11. JSR-269 – formalizováno, integrováno do 1.6 </li></ul>
  12. 12. Deklarace – příklad - 1 public @ interface Foo { } public @ interface RequestForEnhancement { int id (); String synopsis (); String engineer () default &quot;[unassigned]&quot; ; String date () default &quot;[unimplemented]&quot; ; }
  13. 13. Deklarace – gramatika – 1 AnnotationTypeDeclaration : InterfaceModifiers @ interface Identifier AnnotationTypeBody AnnotationTypeBody : { AnnotationTypeElementDeclarations } AnnotationTypeElementDeclarations : AnnotationTypeElementDeclaration AnnotationTypeElementDeclarations AnnotationTypeElementDeclaration
  14. 14. Deklarace – gramatika – 2 AnnotationTypeElementDeclaration : AbstractMethodModifiers Type Identifier ( ) DefaultValue ; ConstantDeclaration ClassDeclaration InterfaceDeclaration EnumDeclaration AnnotationTypeDeclaration ; DefaultValue : default ElementValue
  15. 15. Deklarace – vlastnosti – 1 <ul><li>Stejné jako interface </li><ul><li>Místo deklarace
  16. 16. Rozsah platnosti
  17. 17. Rozsah viditelnosti </li></ul><li>Nesmí být generickým typem
  18. 18. Nesmí obsahovat extends (implicitně dědí od annotation.Annotation)
  19. 19. Libovolný počet elementů (0..*) </li></ul>
  20. 20. Deklarace – vlastnosti – 2 <ul><li>Nesmí se používat zděděné vlastnosti
  21. 21. Elementy můžou mít defaultní hodnotu
  22. 22. Defaultní hodnota je z doby přečtení (ne kompilace)
  23. 23. Anotace T nesmí obsahovat element typu T (přímo i nepřímo) </li><ul><li>@ interface SelfRef { SelfRef value (); }
  24. 24. @ interface Ping { Pong value (); }
  25. 25. @ interface Pong { Ping value (); } </li></ul></ul>
  26. 26. Deklarace – vlastnosti – 3 <ul><li>Přímým předkem je vždy annotation.Annotation
  27. 27. Metody nesmí mít žádné parametry
  28. 28. Metody nesmí mít žádné typové parametry ( <T extends Annotation> T getAnnotation(Class<T> annotationType); )
  29. 29. Deklarace metod nesmí obsahovat throws </li></ul>
  30. 30. Deklarace – vlastnosti – 4 <ul><li>Návratová hodnota musí být: </li><ul><li>Primitivní typ
  31. 31. String
  32. 32. Class
  33. 33. Enum
  34. 34. Anotace
  35. 35. Pole předchozích typů </li></ul></ul>@ interface Illegal { String [][] value (); }
  36. 36. Deklarace – příklad – 2 public @ interface Name { String first (); String last (); } public @ interface Author { Name value (); }
  37. 37. Deklarace – příklad – 3 public @ interface Foo { } public @ interface RequestForEnhancement { int id (); String synopsis (); String engineer () default &quot;[unassigned]&quot; ; String date () default &quot;[unimplemented]&quot; ; }
  38. 38. Použití – příklad – 1 @ RequestForEnhancement ( id = 2868724 , synopsis = &quot;Provide time-travel functionality&quot; , engineer = &quot;Mr. Peabody&quot; , date = &quot;4/1/2004&quot; ) public void travelThroughTime ( Date destination ) { @Preliminary public class TimeTravel {
  39. 39. Použití – gramatika – 1 Annotations : Annotation Annotations Annotation Annotation : NormalAnnotation MarkerAnnotation SingleElementAnnotation
  40. 40. Použití – gramatika – 2 NormalAnnotation : @ TypeName ( ElementValuePairs ) ElementValuePairs : ElementValuePair ElementValuePairs , ElementValuePair ElementValuePair : Identifier = ElementValue
  41. 41. Použití – gramatika – 3 ElementValue : ConditionalExpression Annotation ElementValueArrayInitializer ElementValueArrayInitializer : { ElementValues } ElementValues : ElementValue ElementValues , ElementValue
  42. 42. Použití – gramatika – 4 MarkerAnnotation : @ TypeName SingleElementAnnotation : @ TypeName ( ElementValue )
  43. 43. Použití – vlastnosti – 1 <ul><li>Mezi @ a identifikátorem může být mezera
  44. 44. Nesmí být 2 anotace stejného typu
  45. 45. Musí obsahovat element-value pár pro každý element z použité anotace (defaultních ne)
  46. 46. Může být na libovolném místě mezi modifikátory (konvence: na prvním místě) </li></ul>
  47. 47. Použití – vlastnosti – 2 <ul><li>Může být použita jako modifikátor pro: </li><ul><li>Package
  48. 48. Class
  49. 49. Interface
  50. 50. Člensku proměnnou
  51. 51. Metodu
  52. 52. Paramater metody
  53. 53. Konstruktor
  54. 54. Lokální proměnnou </li></ul></ul>
  55. 55. Použití – vlastnosti – 3 <ul><li>Hodnota nesmí být null
  56. 56. Pokud je element pole a hodnota není ElementValueArrayInitializer, tak se použije jako jediný prvek pole </li></ul>
  57. 57. Použití – příklad – 2 @ Author ( @ Name ( first = &quot;Joe&quot; , last = &quot;Hacker&quot; )) public class BitTwiddle { ... } @ Quality ( Quality . Level . GOOD ) public class Karma { ... } @ Copyright ( &quot;2002 Yoyodyne Systems, Inc., All rights reserved.&quot; ) public class OscillationOverthruster { ... }
  58. 58. Použití – příklad – 3 @ RequestForEnhancement ( id = 2868724 , synopsis = &quot;Provide time-travel functionality&quot; // , // engineer = &quot;Mr. Peabody&quot; , // date = &quot;4/1/2004&quot; ) public void travelThroughTime ( Date destination ) {
  59. 59. Předdefinované anotace <ul><li>Závislé na příslušném API
  60. 60. Některé vyžadují speciální sémantiku
  61. 61. Anotace, které potřebují speciální chování: </li><ul><li>Target
  62. 62. Retentition
  63. 63. Inherited
  64. 64. Override
  65. 65. SuppressWarnings </li></ul></ul>
  66. 66. Target – 1 <ul><li>Specifikuje, k jakému typu elementu může být anotace připojena
  67. 67. Přípustné hodnoty: </li><ul><li>ANNOTATION_TYPE - deklarace anotace
  68. 68. CONSTRUCTOR - deklarace konstruktoru
  69. 69. FIELD - deklarace člena třídy
  70. 70. LOCAL_VARIABLE - deklarace lokální proměnné
  71. 71. PACKAGE - deklarace balíku
  72. 72. METHOD - deklarace metody </li></ul></ul>
  73. 73. Target – 2 <ul><li>Přípustné hodnoty: </li><ul><li>PARAMETER - deklarace parametru metody
  74. 74. TYPE - deklarace typu (třída, rozhraní, anotace, výčtový typ) </li></ul></ul>@ Target ( ElementType . TYPE ) public @ interface Foo { }
  75. 75. Retentition <ul><li>Specifikuje, kde a jak dlouho bude anotace dostupná
  76. 76. Přípustné hodnoty: </li><ul><li>SOURCE – pouze ve zdrojovém kódu
  77. 77. CLASS – v době kompilace, ignorována JVM
  78. 78. RUNTIME – read-only pro JVM </li></ul></ul>@ Retention ( RetentionPolicy.RUNTIME ) public @ interface Foo { }
  79. 79. Inherited @ Retention ( RetentionPolicy . RUNTIME ) @ Target ( ElementType . ANNOTATION_TYPE ) public @ interface Inherited { } <ul><li>Takto oanotovana anotace se dědí
  80. 80. Pouze pro anotace tříd a interfaců
  81. 81. Ukazka: ExInherited </li></ul>
  82. 82. Override @ Retention ( RetentionPolicy . SOURCE ) @ Target ( ElementType . METHOD ) public @ interface Override { } <ul><li>Občas dojde k přetížení (overload) metedy, než k jejímu předefinování (override)
  83. 83. Ukázka: ExOverride </li></ul>
  84. 84. Override – příklad class A { @Override public boolean equals ( A a ) { return false ; } } <ul><li>Kompilátor: ”method does not override or implement a method from a supertype” </li></ul>
  85. 85. SuppressWarnings @ Target ( { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } ) @ Retention ( RetentionPolicy . SOURCE ) public @ interface SuppressWarnings { String [] value (); } <ul><li>Poskytuje kompilátoru informaci, že má vypnout hlášení warningů
  86. 86. Užitečné při kompilaci 1.4 kódu 5.0 kompilátorem </li></ul>
  87. 87. SuppressWarnings – příklad @ SuppressWarnings ( &quot;unchecked&quot; ) public static List toList ( Object [] array ) { return Arrays . asList ( array ); } <ul><li>Kompilátor: &quot;List is a raw type. References to generic type List<E> should be parameterized&quot;. </li></ul>
  88. 88. Deprecated @ Target ( ElementType . RUNTIME ) public @ interface Deprecated { } <ul><li>Upozorní na použití nevhodného elementu (nebezpečné, existuje lepší alternativa) </li></ul>
  89. 89. Deprecated – příklad public class Foo { @Deprecated public void myDeprecatedMethod () { ... } } <ul><li>Kompilátor: &quot;The method myDeprecatedMethod() from the type Foo is deprecated.&quot; </li></ul>
  90. 90. Reference <ul><li>The Java language Specification, Third Edition ( http://java.sun.com/docs/books/jls/index.html )
  91. 91. JSR 175: A Metadata Facility for the JavaTM Programming Language ( http://www.jcp.org/en/jsr/detail?id=175 )
  92. 92. http://www.javabeat.net/articles/java-5-0/2007/08/annotations/ </li></ul>
  93. 93. Otázky? Otázky?
  94. 94. Konec Děkuji za pozornost!

×