直接通过代码简单了解一下:
1 package com.etc; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 /* 11 * 注解不是程序本身,而是对程序作出解释,可以被其他程序读取 12 * 注解信息可以用来处理流程 13 * 格式为:@注释名,可以添加参数值 14 * 如@SuppressWarningss(value="unchecked"). 15 * 可以附加在package,class,method,field等等上面,相当于给他们提供了额外的辅助信息, 16 * 可以通过反射机制编程实现对这些元数据的访问 17 */ 18 public class AnnotationDemo1 extends Object{ 19 20 public static void main(String[] args) { 21 22 AnnotationDemo1 a=new AnnotationDemo1(); 23 System.out.println(a.toString()); 24 a.test(); 25 a.test2(); 26 a.test3(); 27 28 } 29 30 @Override /*表示该方法为重写父类Object下的toString方法,为内置注解*/ 31 public String toString() { 32 return "简单测试"; 33 } 34 35 @Deprecated /*表示不建议程序员使用的方法,为内置注解*/ 36 public void test() { 37 System.out.println("注解入门!"); 38 } 39 40 41 /* 42 * deprecation :使用了过时的类或过时的方法的警告 43 * unchecked :执行了未检查的转换时的警告,如使用泛型时未指定类型 44 * fallthrough:使用switch语句时发生了case穿透 45 * path:在类路径,原文件路径等中有不存在路径的警告 46 * serial:挡在序列化的类上缺少serialVersionUID的警告 47 * finally:任何finally子句不能完成的警告 48 * all:关于以上所有情况的警告 49 * 为内置注解 50 */ 51 @SuppressWarnings("all") 52 /*等同于@SuppressWarnings(value="all"),存在多个则改为@SuppressWarnings(value={"unchecked","deprecation"})*/ 53 public void test2() { 54 List list=new ArrayList(); 55 List list2=new ArrayList(); 56 list.add(1); 57 list2.add(1); 58 System.out.println("内置注解测试:"+list.size()); 59 } 60 61 /* 62 * 自定义注解: 使用@interface自定义注解时-> 自动继承了java.lang.annotation.Annotation接口 63 * 格式:public @interface 注解名{定义体} 64 * 其中的每一个方法实际上就是声明了一个配置参数。 65 * (1)方法的名称就是参数的名称 66 * (2)返回值就是参数的类型 :返回类型只能是基本类型:Class,String,enum 67 * (3)可以通过default来声明参数的默认值 68 * (4)如果只有一个参数成员,一般参数名为value 69 * ps:注解元素必须要有值,经常使用空字符串,0作为默认值,也经常使用负数->-1表示不存在的意义 70 */ 71 72 /*元注解: 73 * 作用:负责注解其他注解,java定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明 74 * 75 * @Target:描述注解的使用范围 ->取值方式: @Target(value=ElementType.参数值) 76 * (1)package包->PACKAGE 77 * (2)类,接口,枚举,Annotation类型->TYPE 78 * (3)类型成员(方法,构造方法,成员变量,枚举值)->{构造方法:"CONSTRUCTOR",方法:"METHOD",描述域:"FIELD"} 79 * (4)方法参数和本地变量->{局部变量:"LOCAL_VARIABLE",描述参数:"PARAMETER"} 80 * 81 * @Retention:表示需要在什么级别保存该注释信息,用于描述注释的生命周期 ->取值方式:@Retention(value=RetentionPolicy.参数值) 82 * (1)在源文件中有效,源文件保留->SOURCE 83 * (2)在class文件中有效,class保留->CLASS 84 * (3)在运行时有效,运行时保留,可以被反射机制读取->RUNTIME 85 * @Document 86 * @Inherited 87 */ 88 89 //表示该注解只能用于方法前面 90 @Target(value=ElementType.METHOD) 91 //或者直接@Target(ElementType.METHOD) 92 public @interface start{ 93 } 94 95 //表示该注释的生命周期只存在于源文件中 96 @Retention(value=RetentionPolicy.SOURCE) 97 public @interface over{ 98 99 } 100 101 //表示该注解只能用于方法,类,接口,枚举,Annotation类型前面,生命周期只存在于源文件中 102 @Target(value={ElementType.METHOD,ElementType.TYPE}) 103 @Retention(value=RetentionPolicy.SOURCE) 104 public @interface up{ 105 //如果不加默认值,需要在加该注释的地方加上默认值 106 String name() ; 107 int id(); 108 int age() default 18; 109 } 110 111 @up(name = "", id = 0) 112 public void test3() { 113 System.out.println("自定义注解简单使用!"); 114 } 115 }
效果截图:
实例:利用自定义注解实现数据库与实体类的信息转换
1.实体类
1 package com.test; 2 3 //利用注解将类与表结构对应,即Person类与数据库表person对应 4 @Table(value = "person") 5 public class Person { 6 //将类属性与表结构中的字段对应 7 @Field(columName = "pname", len = 20, type = "varchar") 8 private String name; 9 10 @Field(columName = "pid", len = 10, type = "int") 11 private int id; 12 13 @Field(columName = "birth", len = 20, type = "varchar") 14 private String birth; 15 16 public String getName() { 17 return name; 18 } 19 public void setName(String name) { 20 this.name = name; 21 } 22 public int getId() { 23 return id; 24 } 25 public void setId(int id) { 26 this.id = id; 27 } 28 public String getBirth() { 29 return birth; 30 } 31 public void setBirth(String birth) { 32 this.birth = birth; 33 } 34 }
2.自定义注解
1 package com.test; 2 3 import static java.lang.annotation.ElementType.TYPE; 4 import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 import java.lang.annotation.Retention; 6 import java.lang.annotation.Target; 7 8 @Retention(RUNTIME) 9 @Target(TYPE) 10 public @interface Table { 11 //对应数据库表名 12 String value(); 13 }
1 package com.test; 2 3 import static java.lang.annotation.ElementType.FIELD; 4 import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 6 import java.lang.annotation.Retention; 7 import java.lang.annotation.Target; 8 9 @Retention(RUNTIME) 10 @Target(FIELD) 11 public @interface Field { 12 //对应表结构中属性的属性名,属性类型,属性长度 13 String columName(); 14 String type(); 15 int len(); 16 }
3.信息处理类
1 package com.test; 2 3 import java.lang.annotation.Annotation; 4 import java.lang.reflect.AnnotatedElement; 5 6 /* 7 * 之后会使用反射读取注解的信息,模拟处理注解信息的流程 8 */ 9 public class Reflex { 10 11 public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException { 12 13 Class c=Class.forName("com.test.Person"); 14 //获取类的所有有效注解 15 Annotation[] ano=c.getAnnotations(); 16 for(Annotation a:ano) { 17 System.out.println(a); 18 } 19 //获得类的指定属性的注解 20 AnnotatedElement f=c.getDeclaredField("name"); 21 Field x=f.getAnnotation(Field.class); 22 System.out.println(x.columName()+" "+x.len()+" "+x.type()); 23 24 } 25 26 }
效果截图:
ps:文章待完善中,如存在问题欢迎大佬指点。