1. 首先看下定义的注解类:
类注解定义, MyClassAnnotation.java:
[java] view plain copy
package com.ross.annotation;
import java.lang.annotation.*;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: class annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE)
public @interface MyClassAnnotation
{
String uri();
String desc();
}
默认构造方法注解定义,MyConstructorAnnotation.java:
[java] view plain copy
package com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: Constructor annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.CONSTRUCTOR)
public @interface MyConstructorAnnotation
{
String uri();
String desc();
}
方法注解定义,MyMethodAnnotation.java:
[java] view plain copy
package com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: method annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.METHOD)
public @interface MyMethodAnnotation
{
String uri();
String desc();
}
字段注解定义, MyFieldAnnotation.java:
[java] view plain copy
package com.ross.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: field annotation
*/
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.FIELD)
public @interface MyFieldAnnotation
{
String uri();
String desc();
}
2. 再看下我们注解的应用和测试:
在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解, 自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.
MySample.java:
[java] view plain copy
package com.ross.annotation;
import java.lang.reflect.*;
/**
* Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
* Date: 2012-1-29
* Since: MyJavaExpert v1.0
* Description: This class is used to show how to use the annotation of each level
*/
@MyClassAnnotation (uri = "com.ross.MySample" , desc = "The class name" )
public class MySample
{
@MyFieldAnnotation (uri = "com.ross.MySample#id" , desc = "The class field" )
public String id;
/**
* Description: default constructor
*/
@MyConstructorAnnotation (uri = "com.ross.MySample#MySample" , desc = "The default constuctor" )
public MySample()
{
}
/**
* Description: normal method
*/
@MyMethodAnnotation (uri = "com.ross.MySample#setId" , desc = "The class method" )
public void setId(String id)
{
this .id = id;
}
/**
* Description: MyAnnotation test
* @throws NoSuchMethodException
* @throws SecurityException
* @throws NoSuchFieldException
*/
public static void main(String[] args) throws SecurityException,
NoSuchMethodException, NoSuchFieldException
{
MySample oMySample = new MySample();
// get class annotation
MyClassAnnotation oMyAnnotation = MySample.class
.getAnnotation(MyClassAnnotation.class );
System.out.println("Class's uri: " + oMyAnnotation.uri() + "; desc: "
+ oMyAnnotation.desc());
// get constructor annotation
Constructor oConstructor = oMySample.getClass().getConstructor();
MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor
.getAnnotation(MyConstructorAnnotation.class );
System.out.println("Constructor's uri: "
+ oMyConstructorAnnotation.uri() + "; desc: "
+ oMyConstructorAnnotation.desc());
// get method annotation
Method oMethod = oMySample.getClass().getDeclaredMethod("setId" ,String. class );
MyMethodAnnotation oMyMethodAnnotation = oMethod
.getAnnotation(MyMethodAnnotation.class );
System.out.println("Method's uri: " + oMyMethodAnnotation.uri()
+ "; desc: " + oMyMethodAnnotation.desc());
// get field annotation
Field oField = oMySample.getClass().getDeclaredField("id" );
MyFieldAnnotation oMyFieldAnnotation = oField
.getAnnotation(MyFieldAnnotation.class );
System.out.println("Field's uri: " + oMyFieldAnnotation.uri()
+ "; desc: " + oMyFieldAnnotation.desc());
}
}
控制台打印结果:
[plain] view plain copy
Class's uri: com.ross.MySample; desc: The class name
Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor
Method's uri: com.ross.MySample#setId; desc: The class method
Field's uri: com.ross.MySample#id; desc: The class field
至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.