[Java] Annotation(内注)实例一则(一)

2014-11-24 09:22:11 · 作者: · 浏览: 1

为下篇“[Android] 数据实体的自动存取--SQLite篇”准备
* 参考地址:http://www.blogjava.net/ericwang/archive/2005/12/13/23743.html
* http://www.blogjava.net/weidagang2046/articles/27958.html
* http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html
* 官方文档:
* http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html
以上链接很全面,不过多说明了。直接上代码,仅做备份
[java]
package lab.sodino.annotation;

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

@Target(ElementType.FIELD)//仅为属性名的修饰有效
@Retention(RetentionPolicy.RUNTIME)//存在RetentionPolicy.RUNTIME、RetentionPolicy.CLASS、RetentionPolicy.SOURCE
@Documented//javadoc可生成相应文档
public @interface unique {

}

[java]
package lab.sodino.annotation;

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

@Target(ElementType.TYPE)//ElementType.TYPE用于标识类、接口(包括内注自身)、枚举
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface author {
//修饰符仅可为public, protected, private & static的组合
public static enum AppEnum {
Web, Client, Service, Undesignated
};

//public & abstract的组合或默认
AppEnum type() default AppEnum.Undesignated;

String name() default "unknown";

String webSite() default "N/A";
}

[java]
package lab.sodino.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
* Java Annotation

*
* 参考地址:http://www.blogjava.net/ericwang/archive/2005/12/13/23743.html

* http://www.blogjava.net/weidagang2046/articles/27958.html

* http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html

* 官方文档:
* http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

* */
public class AnnotationLab {
public static void main(String[] args) {
testField();
testClazz();
}

private static void testClazz() {
try {
Class< > clz = Class.forName(GoodsBean.class.getName());
System.out.println(clz.isAnnotationPresent(author.class));
author au = clz.getAnnotation(author.class);
System.out.println(au.name() + " " + au.webSite());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

private static void testField() {
GoodsBean bean = GoodsBean.newInstance();
Class< extends GoodsBean> clazz = bean.getClass();
Field[] arrFiled = clazz.getDeclaredFields();
for (Field f : arrFiled) {
Annotation[] arrAnno = f.getAnnotations();
System.out.println(arrAnno.length);
if (f.isAnnotationPresent(unique.class)) {
System.out.println(f.getName() + " annotation:unique");
} else {
System.out.println(f.getName() + " annotation:null");
}
}
}
}

[java]
package lab.sodino.annotation;

@author(name="sodino",webSite="sodino.com")//以"key=value"的形式进行赋值。
public class GoodsBean {
@unique
public long id;
public String name;
public