java中的注解
java中的三种内置注解
- @Deprecated
- @Override
- @SuppressWarnings
1 public class Demo01 { 2 //重写的注解 3 @Override 4 public String toString(){ 5 return ""; 6 } 7 8 //被废弃的注解,不建议使用的注解,但并不是不能使用 9 @Deprecated 10 public static void test001(){ 11 System.out.println("test001"); 12 } 13 public static void main(String[] args) { 14 test001(); 15 } 16 17 //消除警告信息的注解,添加属性all,就能过滤掉所有的警告信息 18 @SuppressWarnings(value = { "all" }) 19 public static void test002(){ 20 List ls = new ArrayList(); 21 } 22 }
java中的自定义注解
1 //注解的作用域 这个注解只能作用在方法前面,如果要是让类能读取到的话,就在value里面继续添加元素 2 @Target(value = ElementType.METHOD) 3 4 //加载了这个注解之后,能被反射读取到 source 和 class的话读取不到 5 @Retention(RetentionPolicy.RUNTIME) 6 public @interface MyFirstAnnotation { 7 String name() default ""; 8 int id() default 0; 9 }
使用自定义注解
1 public class Demo02 { 2 //使用注解的时候只能作用于方法前面,不能作用于类前面 3 @MyFirstAnnotation 4 public String test01(){ 5 return ""; 6 } 7 }
java中元注解有四个: @Retention @Target @Document @Inherited;
@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
例子:使用自定义注解
第一步:创建实体类,与数据库中的数据表相对应
1 //使用Table注解对应表信息 2 @Table("tb_student") 3 public class ZzpStudent { 4 //使用ZzpFiled注解,对应数据表里面的列名 类型 和 长度 5 @ZzpFiled(columnName = "id",type = "int",length = 10) 6 private int id; 7 @ZzpFiled(columnName = "sname",type = "String",length = 10) 8 private String sname; 9 @ZzpFiled(columnName = "age",type = "int",length = 3) 10 11 private int age; 12 13 public int getId() { 14 return id; 15 } 16 public void setId(int id) { 17 this.id = id; 18 } 19 public String getSname() { 20 return sname; 21 } 22 public void setSname(String sname) { 23 this.sname = sname; 24 } 25 public int getAge() { 26 return age; 27 } 28 public void setAge(int age) { 29 this.age = age; 30 } 31 }
第二步:创建两个注解,第一个注解跟表名称相对应,第二个注解跟表里面的字段属性相对应,注解创建好了之后,将注解加到第一步中的实体类里面
1 @Target(value = {ElementType.TYPE}) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface Table { 4 //当跟表名称对应只有一个参数的时候,取名叫value 5 String value(); 6 }
1 //此注解修饰表里面字段的属性 2 @Target(value = {ElementType.FIELD}) 3 @Retention(RetentionPolicy.RUNTIME) 4 public @interface ZzpFiled { 5 //数据的列名 6 String columnName(); 7 //数据的类型 8 String type(); 9 //数据的长度 10 int length(); 11 }
第三步:利用反射读取注解信息,或拼接sql语句,在数据库中生成相应的表
1 /** 2 * 3 *使用反射读取注解的信息,模拟处理注解的流程 4 *@author Zhang XiaoDao 5 */ 6 public class Demo03 { 7 8 public static void main(String[] args) throws NoSuchFieldException, SecurityException{ 9 try { 10 //通过反射加载需要处理的类 11 Class clazz = Class.forName("com.zzp.annotation.ZzpStudent"); 12 13 //获得类的所有有效的注解 14 Annotation[] Annotations = clazz.getAnnotations(); 15 for (Annotation at : Annotations) { 16 System.out.println(at); 17 } 18 19 //获取类的指定的注解 20 Table t = (Table) clazz.getAnnotation(Table.class); 21 //输出t的值 22 System.out.println(t.value()); 23 24 //获取类的属性的注解 25 Field f = clazz.getDeclaredField("sname"); 26 ZzpFiled t1 = f.getAnnotation(ZzpFiled.class); 27 System.out.println(t1.columnName()+"---"+t1.type()+"---"+t1.length()); 28 29 //可以根据获得的表名,属性等,拼出DDL语句,使用JDBC执行这个sql,在数据库中生成相关的表 30 31 } catch (ClassNotFoundException e) { 32 e.printStackTrace(); 33 } 34 35 } 36 37 }
第四步:结果
1 @com.zzp.annotation.Table(value=tb_student) 2 tb_student 3 sname---String---10
@Retention:注解的保留位置
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
例子:使用自定义注解
第一步:创建实体类,与数据库中的数据表相对应
1 //使用Table注解对应表信息 2 @Table("tb_student") 3 public class ZzpStudent { 4 //使用ZzpFiled注解,对应数据表里面的列名 类型 和 长度 5 @ZzpFiled(columnName = "id",type = "int",length = 10) 6 private int id; 7 @ZzpFiled(columnName = "sname",type = "String",length = 10) 8 private String sname; 9 @ZzpFiled(columnName = "age",type = "int",length = 3) 10 11 private int age; 12 13 public int getId() { 14 return id; 15 } 16 public void setId(int id) { 17 this.id = id; 18 } 19 public String getSname() { 20 return sname; 21 } 22 public void setSname(String sname) { 23 this.sname = sname; 24 } 25 public int getAge() { 26 return age; 27 } 28 public void setAge(int age) { 29 this.age = age; 30 } 31 }
第二步:创建两个注解,第一个注解跟表名称相对应,第二个注解跟表里面的字段属性相对应,注解创建好了之后,将注解加到第一步中的实体类里面
1 @Target(value = {ElementType.TYPE}) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface Table { 4 //当跟表名称对应只有一个参数的时候,取名叫value 5 String value(); 6 }
1 //此注解修饰表里面字段的属性 2 @Target(value = {ElementType.FIELD}) 3 @Retention(RetentionPolicy.RUNTIME) 4 public @interface ZzpFiled { 5 //数据的列名 6 String columnName(); 7 //数据的类型 8 String type(); 9 //数据的长度 10 int length(); 11 }
第三步:利用反射读取注解信息,或拼接sql语句,在数据库中生成相应的表
1 /** 2 * 3 *使用反射读取注解的信息,模拟处理注解的流程 4 *@author Zhang XiaoDao 5 */ 6 public class Demo03 { 7 8 public static void main(String[] args) throws NoSuchFieldException, SecurityException{ 9 try { 10 //通过反射加载需要处理的类 11 Class clazz = Class.forName("com.zzp.annotation.ZzpStudent"); 12 13 //获得类的所有有效的注解 14 Annotation[] Annotations = clazz.getAnnotations(); 15 for (Annotation at : Annotations) { 16 System.out.println(at); 17 } 18 19 //获取类的指定的注解 20 Table t = (Table) clazz.getAnnotation(Table.class); 21 //输出t的值 22 System.out.println(t.value()); 23 24 //获取类的属性的注解 25 Field f = clazz.getDeclaredField("sname"); 26 ZzpFiled t1 = f.getAnnotation(ZzpFiled.class); 27 System.out.println(t1.columnName()+"---"+t1.type()+"---"+t1.length()); 28 29 //可以根据获得的表名,属性等,拼出DDL语句,使用JDBC执行这个sql,在数据库中生成相关的表 30 31 } catch (ClassNotFoundException e) { 32 e.printStackTrace(); 33 } 34 35 } 36 37 }
第四步:结果
1 @com.zzp.annotation.Table(value=tb_student) 2 tb_student 3 sname---String---10