为下篇“[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
以上链接很全面,不过多说明了。直接上代码,仅做备份
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 { }
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"; }
package lab.sodino.annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Field; /** * Java Annotation<br/> * * 参考地址:http://www.blogjava.net/ericwang/archive/2005/12/13/23743.html<br/> * http://www.blogjava.net/weidagang2046/articles/27958.html<br/> * http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html<br/> * 官方文档: * http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html<br/> * */ 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"); } } } }
package lab.sodino.annotation; @author(name="sodino",webSite="sodino.com")//以"key=value"的形式进行赋值。 public class GoodsBean { @unique public long id; public String name; public long time; public int price; public boolean isPaid; /** 测试用。 */ public byte testByte; /** 测试用。 */ public short testShort; public float cicle; public double testDouble; public String toString() { StringBuffer strBuffer = new StringBuffer(); strBuffer.append("id[" + id + "]\n"); strBuffer.append("name[" + name + "]\n"); strBuffer.append("time[" + time + "]\n"); strBuffer.append("price[" + price + "]\n"); strBuffer.append("isPaid[" + isPaid + "]\n"); strBuffer.append("cicle[" + cicle + "]\n"); strBuffer.append("testByte[" + testByte + "]\n"); strBuffer.append("testShort[" + testShort + "]\n"); strBuffer.append("testDouble[" + testDouble + "]\n"); return strBuffer.toString(); } public static GoodsBean newInstance() { GoodsBean bean = new GoodsBean(); bean.id = 123456789l; bean.name = "AutoSave"; bean.time = 12345234252342l; bean.price = 1024; bean.isPaid = true; bean.cicle = 2.356f; bean.testByte = 8; bean.testShort = 128; bean.testDouble = 9856.2145d; return bean; } }