Annotation - 碁峰資訊epaper.gotop.com.tw/pdf/A155.pdf · Retention meta-annotation Java...

Preview:

Citation preview

83

Annotation

Annotating Override

Method

Annotating Deprecated

Method

Annotation

Annotation Annotate

AnnotationTarget

AnnotationRetention

Annotation

Annotation

Annotation Reflecting

metadata metadata

Java

Javadoc metadata

Javadoc

null Javadoc

non-null null null

Tiger

annotation metadata

annotation package type declaration constructor

method field parameter variable modifier

name=value Java

annotation

Annotation Standard annotation types Tiger out of the box

java.lang package

annotation

Tiger annotation

Override

java.lang.Override method override

superclass method

Deprecated

java.lang.Deprecated method element

SupressWarnings

java.lang.SupressWarnings c lass method f ie ld

variable

Override annotation

@Overridepublic String toString( ) {

return super.toString( ) + " [modiÞed by subclass]";}

Deprecated

@Deprecated public class Betamax { ... }

SuppressWarnings

@SuppressWarnings("unchecked")public void nastyMethod( ) {

// }

annotation

annotation

annotation

<p.84>

annotation annotation

annotation annotation

anno ta t ion Override

84 Annotation

import

"java.lang" package

Deprecated SuppressWarnings annotation annotation

Java method class variable

annotation Override

annotation Override

anno ta t ion SuppressWarnings

unchecked annotation

annotation member

name=value annotation member

annotation annotation

Marker annotation

marker annotation member annotation

annotation member

annotation marker

marker

@MarkerAnnotation

Single-value annotation

single-value annotation member value single-value

annotation

@SingleValueAnnotation("some value")

Full annotation

full annotation annotation

annotation annotation

member

@Reviews({ // array@Review(grade=Review.Grade.EXCELLENT, reviewer="df"),@Review(grade=Review.Grade.UNSATISFACTORY, reviewer="eg",

comment="This method needs an @Override annotation")})

annotation

annotation

annotation

annotation

Annotation 85

...... XDoclet http://xdoclet.sourceforge.net

XDoclet

managing dependence EJB

metadata Javadoc

annotation XDoclet Javadoc

Javadoc tag

tag annotation

Java

@Overridde //

annotation XDoclet

Java

annotation XDoclet

Annotating Override MethodOverride annotat ion marker inter face

member method overr iding superclass

method override method

method list

Override marker interface

anno ta t ion a t @

Override overriding method

6-1

6-1. Override annotation

package com.oreilly.tiger.ch06;

public class OverrideTester {

86 Annotation

"at" @ annotation

public OverrideTester( ) { }

@Overridepublic String toString( ) {

return super.toString( ) + " [OverrideTester Implementation]";}

@Overridepublic int hashCode( ) {

return toString( ).hashCode( );}

}

hashCode() method

@Overridepublic int hasCode( ) {

return toString( ).hashCode( );}

hashCode() method overriding

annotation class

[javac] src\ch06\OverrideTester.java:1:method does not override a method from its superclass

[javac] @Override[javac] ^[javac] 1 error

annotation

.... . . overr idden method Override overr id ing

method overridden method

Java method overridden

method abstract

Annotating Deprecated MethodOverride java.lang.Deprecated marker annotation

Javadoc @deprecated tag

...

c l a s s me thod over r id ing

Deprecated

m ethod

Override-Tester

Annotating Deprecated Method 87

Deprecated marker interface member

Override

Override annotation 6-2 Deprecated

6-2. Deprecated annotation

package com.oreilly.tiger.ch06;

public class DeprecatedClass {

/*** method doSomethingElse( ) * doSomethingElse( ) */

@Deprecated public void doSomething( ) {// ...

}

public void doSomethingElse( ) {//

}}

annotation class

override method 6-3 class

6-3. overriding method

package com.oreilly.tiger.ch06;

public class DeprecatedTester extends DeprecatedClass {

public void doSomething( ) {// Override method

}}

class deprecation

[javac] src\ch06\DeprecatedTester.java:5: warning:[deprecation] doSomething( ) in

com.oreilly.tiger.ch06.DeprecatedClass has been deprecated[javac] public void doSomething( ) {[javac] ^

88 Annotation

"-Xlint:deprecation"

deprecation

XDoclet

.... . . @deprecated Javadoc

Deprecated annotation Javadoc comments

Javadoc class Deprecated

annotation

method class

@deprecated

javac -deprecation

-deprecation -Xlint:deprecation

-Xlint:deprecation JDK

Tiger

Tiger Tiger

collection Tiger typing

catch 22 Tiger

annotation SuppressWarnings

class method field/variable

SuppressWarnings Deprecated Override marker

interface value member value String array

String[] member array

annotation unchecked

Javadoc tag

annotation

"-Xlint"

Java

"switch"

enumerated

89

/*** Tiger method*/

@SuppressWarnings(value={"unchecked"})public void nonGenericsMethod( ) {

List wordList = new ArrayList( );

wordList.add("foo");}

Tige r

generic wordlist unchecked

SuppressWarnings annotation

annotation Tiger Tiger

annotation

[javac] src\ch06\SuppressWarningsTester.java:15:warning: [unchecked] unchecked call to add(E) as a member of the

raw type java.util.List[javac] wordList.add("foo");[javac] ^

Tiger

SuppressWarnings

/*** Tiger method*/

@SuppressWarnings(value={"unchecked", "fallthrough"})public void nonGenericsMethod( ) {

List wordList = new ArrayList( );

wordList.add("foo");}

member annotation

member member value

value=

/*** Tiger method*/

@SuppressWarnings({"unchecked", "fallthrough"})public void nonGenericsMethod( ) {

List wordList = new ArrayList( );

wordList.add("foo");}

90 Annotation

com.oreilly.tiger.ch06.Suppress-W arningsTester

m ember array

annotation value member

Annotation annotation

annotation

anno ta t ion T ige r

@interface

annotation Java interface

Java interface @interface

in ter face annota t ion

interface 6-4 marker interface

6-4. marker annotation

package com.oreilly.tiger.ch06;

/** * method class marker annotation*/

public @interface InProgress { }

method class

@com.oreilly.tiger.ch06.InProgresspublic void calculateInterest(ßoat amount, ßoat rate) {

// method }

member annotation 6-5

6-5. member annotation

package com.oreilly.tiger.ch06;

/*** annotation */

public @interface TODO {String value( );

}

"InProgress" package prefix

Javaclass

Annotation 91

member

member method value()

method member

annotation interface method

abstract

value

@TODO(stringValue)

@com.oreilly.tiger.ch06.InProgress@TODO("Figure out the amount of interest per month")public void calculateInterest(ßoat amount, ßoat rate) {

// method }

member 6-6

6-6. annotation member

package com.oreilly.tiger.ch06;

public @interface GroupTODO {

public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION };

Severity severity( );String item( );String assignedTo( );

}

enumerated severity member item

assignedTo TODO

@com.oreilly.tiger.ch06.InProgress@GroupTODO(

severity=GroupTODO.Severity.CRITICAL,item="Figure out the amount of interest per month",assignedTo="Brett McLaughlin"

)public void calculateInterest(ßoat amount, ßoat rate) {

// method }

member

6-7 6-6

92 Annotation

Java

JavaBean fried-

and-true

setXXX() getXXX() m ethod

6-5 "TODO"

enumerated

6-7. annotation

package com.oreilly.tiger.ch06;

import java.util.Date;

public @interface GroupTODO {

public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION };

Severity severity( ) default Severity.IMPORTANT;String item( );String assignedTo( );String dateAssigned( );

}

generic

......extending interface annotation @interface

java.lang.annotation.Annotation

extend annotation

ex tend anno ta t ion

annotation

Annotation Annotateannotate annotate annotation

Javadoc comments class

me ta -anno ta t ion anno ta t ion

annotation annotation

meta-annotation java.lang.annotation

package

Target

meta-annotation annotation

Annotation Annotate 93

Retention

meta-annotation annotation

class annotation

Java virtual machine class annotation

Documented

meta-annotation annotation

API

Inherited

meta-annotation class annotation

annotated

meta-

annotation

Annotation Targetmeta -anno ta t ion Target

annotation annotation

annotation

Target annotation

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE})

public @interface TODO {

Target member array

java.lang.annotation.ElementType enum enumerated

enum annotation

6-8

6-8. ElementType enum

package java.lang.annotation;

public enum ElementType {TYPE, // Class, interface, or enum ( annotation)

94 Annotation

Target

ElementType[]

FIELD, // Field ( enumerated values)METHOD, // Method ( constructors)PARAMETER, // Method parameterCONSTRUCTOR, // ConstructorLOCAL_VARIABLE, // Local variable catch ANNOTATION_TYPE, // Annotation Types (meta-annotations)PACKAGE // Java Package

}

import Target ElementType 6-9

TODO annotation 6-5

6-9. annotation annotate

package com.oreilly.tiger.ch06;

import java.lang.annotation.ElementType;import java.lang.annotation.Target;

/*** annotation */

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE})

public @interface TODO {String value( );

}

Target meta-annotation 6-

10 meta-annotation

6-10. Target annotation

package java.lang.annotation;

@Documented@Retention(RetentionPolicy.RUNTIME);@Target(ElementType.ANNOTATION_TYPE)public @interface Target {

ElementType[] value( );}

.... . . annotation

Target

Target

ElementTypes

Annotation Target 95

Annotation RetentionRetention meta -anno ta t ion Java

annotation annotation class

class Java virtual machine annotation

class class annotation

Retention

Target annotation public @interface

annotation retention Target Retention

enum c la s s

java.lang.annotation.RetentionPolicy enum 6-11

6-11. RetentionPolicy enum

package java.lang.annotation;

public enum RetentionPolicy {SOURCE, // Annotation CLASS, // Annotation class , VM RUNTIME // Annotation class VM

}

anno ta t ion re ten t ion po l i cy

RetentionPolicy.CLASS annotation VM class

Retention SuppressWarnings annotation

annotation

class bytecode

@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings {

Annotation annotation

Annotation

annotation InProgress TODO GroupTODO

J avadoc

96 Annotation

import java.lang.annotation.Retention java.lang.annotation.RetentionPolicy

Ant buildfile"ant Javadoc"

Javadoc

Documented meta-annotation

annotation Javadoc

Javadoc

Documented API

com.oreilly.tiger.ch06 package AnnotationTester

class calculateInterest() method

6-1

method

@com.oreilly.tiger.ch06.InProgress@GroupTODO(

severity=GroupTODO.Severity.CRITICAL,item="Figure out the amount of interest per month",assignedTo="Brett McLaughlin",dateAssigned="04-26-2004"

)public void calculateInterest(ßoat amount, ßoat rate) {

// method }

Annotation 97

InProgress GroupTODO annotation

Javadoc

@Documented meta-annotation

Javadoc annotat ion InProgress

GroupTODO TODO 6-12

InProgress annotation

6-12. InProgress

package com.oreilly.tiger.ch06;

import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;

/*** method class marker annotation*/

@Documented@Retention(RetentionPolicy.RUNTIME)public @interface InProgress { }

Retention meta-annotation class

Documented anno ta t ion

RetentionPolicy.RUNTIME re ten t ion

com.oreilly.tiger.ch03 annotation

Javadoc class Javadoc

com.oreilly.tiger.ch06 AnnotationTester

calculateInterest() method 6-2 method

annotation Javadoc

Annotation c la s s

deprecated

class extend

deprecated superclass

deprecated class deprecation

subclass

98 Annotation

"ant clean"

class Javadoc

Javadoc

deprecated c lass

deprecated class superclass Inherited

meta-annotation

annotat ion

InProgress 6-13 annotation class

6-13. InProgress annotation

package com.oreilly.tiger.ch06;

import java.io.IOException;import java.io.PrintStream;

@InProgresspublic class Super {

public void print(PrintStream out) throws IOException {out.println("Super printing...");

}}

6-14 extend Super class

Annotation 99

6-14. Super extending

package com.oreilly.tiger.ch06;

import java.io.IOException;import java.io.PrintStream;

public class Sub extends Super {

public void print(PrintStream out) throws IOException {out.println("Sub printing...");

}}

class Javadoc 6-3 Super

Sub class

6-4

InProgress annotation

InProgress

100 Annotation

@Documented@Inherited@Retention(RetentionPolicy.RUNTIME)public @interface InProgress { }

class Javadoc

Sub

reflection

reflection Sub Javadoc

re f l ec t ion anno ta t ion Annota t ion

Reflecting

......interface Inherited annotation subclass

annotation method annotation

superclass overr ide method

method annotation superclass annotation

subclass

Annotation 101

TIP

Annotation Reflectingannotation

Javadoc

re f lec t ion c lass f ie ld method

annotation java.lang.reflect package

anno ta t ion isAnnotationPresent()

method annotation true/false

public void testAnnotationPresent(PrintStream out) throws IOException {Class c = Super.class;boolean inProgress = c.isAnnotationPresent(InProgress.class);if (inProgress) {

out.println("Super is In Progress");} else {

out.println("Super is not In Progress");}

}

run-ch06:[echo] Running Chapter 6 examples from Java Tiger:

A Developer's Notebook[echo] Running ReßectionTester...[java] Super is In Progress

Inherited annotation

Annotation

public void testInheritedAnnotation(PrintStream out) throws IOException {Class c = Sub.class;boolean inProgress = c.isAnnotationPresent(InProgress.class);if (inProgress) {

out.println("Sub is In Progress");

102 Annotation

ReflectionTesterclass

Annotation

"Super"

} else {out.println("Sub is not In Progress");

}}

Sub Super

InProgress annotation Inherited

subclass method

run-ch06:[echo] Running Chapter 6 examples from Java Tiger: A Developer's Notebook[echo] Running VarargsTester...[java] Super is In Progress[java] Sub is In Progress

Javadoc reflection

marker in te r f ace

isAnnotationPresent() annotation

public void testGetAnnotation(PrintStream out)throws IOException, NoSuchMethodException {

Class c = AnnotationTester.class;MethodElement element = c.getMethod("calculateInterest",

ßoat.class, ßoat.class);

GroupTODO groupTodo = element.getAnnotation(GroupTODO.class);String assignedTo = groupTodo.assignedTo( );

out.println("TODO Item on Annotation Tester is assigned to: '" +assignedTo + "'");

}

method Annota t ionTes te r

calculateInterest() method annotation

GroupTODO annotation assignedTo

method

run-ch06:[echo] Running Chapter 6 examples from Java Tiger:

A Developer's Notebook

[echo] Running ReßectionTester...[java] Super is In Progress[java] Sub is In Progress[java] TODO Item on Annotation Tester is assigned to:

'Brett McLaughlin'

annotationreflection

annotation

Annotation Reflecting 103

getAnnotation()

annotation iterate

annotation getAnnotations()

method annotation

public void printAnnotations(AnnotatedElement e, PrintStream out)throws IOException {

out.printf("Printing annotations for '%s'%n%n", e.toString( ));

Annotation[] annotations = e.getAnnotations( );for (Annotation a : annotations) {

out.printf(" * Annotation '%s' found%n",a.annotationType( ).getName( ));

}}

AnnotationTester calculateInterest() method

run-ch06:[echo] Running Chapter 6 examples from Java Tiger: A Developer's Notebook[echo] Running ReßectionTester...[java] Super is In Progress[java] Sub is In Progress[java] TODO Item on Annotation Tester is assigned to: 'Brett McLaughlin'[java] Printing annotations for 'public void com.oreilly.tiger.ch06.Annotat

ionTester.calculateInterest(�oat,�oat)'

[java] * Annotation 'com.oreilly.tiger.ch06.InProgress' found[java] * Annotation 'com.oreilly.tiger.ch06.GroupTODO' found

6-15

ReflectionTester reflection annotation

method

6-15. ref lection annotation method

package com.oreilly.tiger.ch06;

import java.io.IOException;import java.io.PrintStream;import java.lang.reßect.AnnotatedElement;import java.lang.annotation.Annotation;

public class ReßectionTester {

104 Annotation

for/in

printf()

m ethod

annotation

getDeclared-Annotations()

getAnnotations()

public ReßectionTester( ) {}

public void testAnnotationPresent(PrintStream out) throws IOException {Class c = Super.class;boolean inProgress = c.isAnnotationPresent(InProgress.class);if (inProgress) {

out.println("Super is In Progress");} else {

out.println("Super is not In Progress");}

}

public void testInheritedAnnotation(PrintStream out) throws IOException {Class c = Sub.class;boolean inProgress = c.isAnnotationPresent(InProgress.class);if (inProgress) {

out.println("Sub is In Progress");} else {

out.println("Sub is not In Progress");}

}

public void testGetAnnotation(PrintStream out)throws IOException, NoSuchMethodException {

Class c = AnnotationTester.class;AnnotatedElement element = c.getMethod("calculateInterest",

ßoat.class, ßoat.class);

GroupTODO groupTodo = element.getAnnotation(GroupTODO.class);String assignedTo = groupTodo.assignedTo( );

out.println("TODO Item on Annotation Tester is assigned to: '" +assignedTo + "'");

}

public void printAnnotations(AnnotatedElement e, PrintStream out)throws IOException {

out.printf("Printing annotations for '%s'%n%n", e.toString( ));

Annotation[] annotations = e.getAnnotations( );for (Annotation a : annotations) {

out.printf(" * Annotation '%s' found%n",a.annotationType( ).getName( ));

}}

AnnotatedElementreflection

m ethod class

interface

annotationm ethod

Annotation Reflecting 105

6-15. ref lection annotation method

public static void main(String[] args) {try {

ReßectionTester tester = new ReßectionTester( );

tester.testAnnotationPresent(System.out);tester.testInheritedAnnotation(System.out);

tester.testGetAnnotation(System.out);

Class c = AnnotationTester.class;AnnotatedElement element = c.getMethod("calculateInterest",

ßoat.class, ßoat.class);tester.printAnnotations(element, System.out);

} catch (Exception e) {e.printStackTrace( );

}}

}

java.lang.reßect.AnnotatedElement interface Tiger

reflection interface Class Constructor

Field Method Package AccessibleObject

annotation AnnotatedType

method

public Annotation getAnnotation(Class annotationType);

public Annotation[] getAnnotations( );

public Annotation[] getDeclaredAnnotations( );

public boolean isAnnotationPresent(Class annotationType);

Java AnnotatedType

method annotation

.... . . annota t ion

annotation RetentionpPolicy.RUNTIME

annotation VM

106 Annotation

generic

Javadoc Annotated-Element

m ethod

reflection annotation

Inherited Documented annotation annotation

@Retention(RetentionPolicy.RUNTIME)

/

Annotation Reflecting 107

108 Annotation

Recommended