第一篇 java中的注解

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 }

第二步:创建两个注解,第一个注解跟表名称相对应,第二个注解跟表里面的字段属性相对应,注解创建好了之后,将注解加到第一步中的实体类里面

扫描二维码关注公众号,回复: 1188890 查看本文章
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 

猜你喜欢

转载自www.cnblogs.com/zhangzhipeng001/p/9114191.html
今日推荐