反射与注解的使用

转载 2015年07月10日 11:38:16

作用:注解是附加在代码中的一些信息,用于编译、运行时解析和使用,起到说明配置作用 

主要学习两方面1 元注解,2 自定义注解 

一、元注解 

包括:1.@Target,  2.@Retention  3.@Documented, 4.@Inherited 几种

1 @Target 

  作用:用于描述注解的使用范围(即 注解是描述:包、类、字段、方法、参数、接口等)

  取值:1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域

    3.LOCAL_VARIABLE:用于描述局部变量

    4.METHOD:用于描述方法

    5.PACKAGE:用于描述包

    6.PARAMETER:用于描述参数

    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

 

@Target(ElementType.TYPE) //注解用于描述类的

public @interface Table {

    /**

     * 数据表名称注解,默认值为类名称

     * @return

     */

    public String tableName() default "className";

}

 

@Target(ElementType.FIELD) //注解用在字段上

public @interface NoDBColumn {

}

 

2.@Retention

  作用:描述注解的生命周期(1 仅存在源码中,不会被编译 2 存在编译器中,不会在运行中取到 3 存在与类运行期,运行时可以通过反射读取)

  取值(RetentionPoicy)有:

1.SOURCE:在源文件中有效(即源文件保留)

    2.CLASS:在class文件中有效(即class保留)

    3.RUNTIME:在运行时有效(即运行时保留)

 

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)//注解可以在运行期通过反射取得

public @interface Column {

    public String name() default "fieldName";

}

 

3.@Documented,

 @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

 

4.@Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类

 

 

二、自定义注解

      使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口,其中每一个方法声明一个配置参数,方法名称就是参数名称,

  返回值就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

 

例子:两个注解,分别标识实体对应的表和数据库中字段

1 类注解 

Java代码  收藏代码
  1. @Target(value=ElementType.TYPE)//表示该注解用于类上面  
  2. @Retention(RetentionPolicy.RUNTIME) //运行时可以通过反射取得  
  3. public @interface Table {  
  4.     public String name() default "";  
  5. }  

 

   2 属性注解,并且注解有两个属性

Java代码  收藏代码
  1. <span style="color: #ff6600;">@Target(value=ElementType.FIELD)  
  2. @Retention(RetentionPolicy.RUNTIME)</span>  
  3. public @interface Column {  
  4.     public String value() default "";   
  5.     public boolean isKey() default false;  
  6. }  

 

  3 实体 

  

Java代码  收藏代码
  1. package anotation;  
  2.   
  3. @Table(name="s_user")  
  4. public class User {  
  5.       
  6.     @Column(value="id",isKey=true)  
  7.     private Integer id;  
  8.       
  9.     @Column("s_name") /<span style="color: #ff6600;">/没有指定注解的name 则默认name为value 等同于 value="s_name"</span>  
  10.     private String name;  
  11.       
  12.     @Column(value="s_age")  
  13.     private Integer age;  
  14.       
  15.     public Integer getId() {  
  16.         return id;  
  17.     }  
  18.     public void setId(Integer id) {  
  19.         this.id = id;  
  20.     }  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public Integer getAge() {  
  28.         return age;  
  29.     }  
  30.     public void setAge(Integer age) {  
  31.         this.age = age;  
  32.     }  
  33. }  

  4  测试类,通过反射得到类的各种信息 

  

Java代码  收藏代码
  1. public class Test {  
  2.       
  3.     public static void main(String[] args) throws  Exception {  
  4.         User user = new User();  
  5.         user.setId(1);  
  6.         user.setName("wang");  
  7.         user.setAge(89);  
  8.           
  9. //      Class<User> userClazz = (Class<User>) Class.forName( "anotation.User");  
  10.         Class  userClazz = user.getClass();  
  11.         Table table = (Table) userClazz.getAnnotation(Table.class); //得到类的注解   
  12.         System.out.println("表名称 : "+table.name() ); //取得注解的名称 属性  
  13.           
  14.         Field[]  fields = userClazz.getDeclaredFields(); //得到所有的 对象的属性   
  15.         for(int i=0;i<fields.length;i++ ){  
  16.             Field field = fields[i];  
  17.               
  18.             Column column  = field.getAnnotation(Column.class );//得到属性上的注解   
  19.             System.out.println( "column的注解名称:"+column.value()+"   注解:isKey===  "+column.isKey() );//打印属性上的注解  
  20.               
  21.             String fieldName = field.getName(); //得到属性名称   
  22.             Class clazz = field.getType();//得到属性类型   
  23.             System.out.println(fieldName + "   字段类型    "+clazz );  
  24.               
  25.             field.setAccessible(true);//可以访问私有变量   
  26.             System.out.println( fieldName + "  调用字段变量取得字段值  "+ field.get(user ) );//打印对象的该属性的值   
  27.             Method method = userClazz.getMethod("get"+toUpperCaseFirstOne(fieldName) );//调用get取得该对象的值  
  28.             System.out.println( fieldName + "  调用字段get方法取出字段值  "+  method.invoke(user) );  
  29.               
  30.               
  31.             System.out.println("判断字段类型是否为整形:"+( clazz==Integer.class));//判断一个字段的类型    
  32.             System.out.println( "============");  
  33.               
  34.         }  
  35. //      Object name = 1;  
  36. //      System.out.println( name.getClass().equals( Integer.class) );  
  37.           
  38.     }  
  39.       
  40.   
  41.     /** 
  42.      * 首字母转大写 
  43.      * @param s 
  44.      * @return 
  45.      */  
  46.     public static String toUpperCaseFirstOne(String s)  
  47.     {  
  48.         if(Character.isUpperCase(s.charAt(0)))  
  49.             return s;  
  50.         else  
  51.             return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();  
  52.     }  
  53. }  

Java自定义注解和运行时靠反射获取注解

java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 jav...
  • bao19901210
  • bao19901210
  • 2013年12月08日 16:05
  • 129290

理解Android中的注解与反射

前言最近一段时间在研究EventBus和Retrofit 的过程中,都遇到了注解这个概念。由于在学习Java的时候对这方面没有深入了解过,所以看起相关的代码来,总会有点不知其所以然,这里就注解和反射的...
  • TOYOTA11
  • TOYOTA11
  • 2016年09月02日 23:46
  • 1794

依赖注入原理(为什么需要依赖注入)

0. 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一。本文主要介绍依赖注入原理和常见的...
  • coderder
  • coderder
  • 2016年07月13日 14:25
  • 39303

java注解,@,注解有什么用?

@是java注解,即annotation。 1可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 2Java注解是附加在代码中的一些元信息,用于一些工具在编译、运...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年11月11日 14:44
  • 6544

注解与反射

反射、注解  写框架用得比较多 反射会比我们正常写效率会低一点 原因: 反射 先new类class,然后在从类里面new对象。所以搞框架,因为也不知道别人想要做什么,所以我们就是规则制定者 ...
  • xiaoyifeishuang1
  • xiaoyifeishuang1
  • 2016年06月28日 22:46
  • 160

注解和反射

1、JDK中提供的三个基本的注解 @Deprecated:标注XX过时的。 @SuppressWarnings:抑制警告 unused:抑制的警告类型 { "unused", "raw...
  • qq_20261343
  • qq_20261343
  • 2016年02月08日 16:21
  • 186

使用注解反射实现BaseDao(代替XML配置)

java 注解 代替 XML配置
  • u013905744
  • u013905744
  • 2016年09月13日 11:05
  • 540

Java注解处理之反射API

java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Ann...
  • liuxigiant
  • liuxigiant
  • 2017年01月09日 23:23
  • 675

使用反射读取注解

package annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Field; public...
  • chunxiaqiudong5
  • chunxiaqiudong5
  • 2016年10月13日 16:17
  • 214

使用反射+注解,教你学会最简单的依赖注入

本文意于让人简单地使用注解跟反射,用注解让控件实现findViewById()以及setOnClickListener(),不再重复写findViewById这些重复性的工作。 市面上已经有很多这种框...
  • xqx5140
  • xqx5140
  • 2017年03月02日 16:16
  • 337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射与注解的使用
举报原因:
原因补充:

(最多只允许输入30个字)