JAVA注解学习

最近通过观看慕课网,学习了java注解,趁热打铁对java注解进行整理:

慕课网视频:http://www.imooc.com/learn/456


1、什么是java注解
  • java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:

    1. 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等;

    2. 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;

    3. 在编译时进行格式检查。如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;

  • 注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。

2、注解分类

注解按照运行机制划分。

源码注解:注解只在源码中存在,编译成.class文件就不存在了;
编译时注解:注解在源码和.class文件中都存在(例:JDK自带注解 @Override);
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解;


  • 常用注解:JDK内置系统注解:

    1. @Override,表示当前的方法定义将覆盖超类中的方法。
    2. @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。
    3. @SuppressWarnings,关闭不当编译器警告信息。
  • java四种元注解
    注解的注解

    1. @Target

      @Target 表示该注解用于什么地方,可取的值包括:

      ElemenetType.CONSTRUCTOR     构造器声明
      ElemenetType.FIELD          域声明(包括 enum 实例)
      ElemenetType.LOCAL_VARIABLE    局部变量声明
      ElemenetType.METHOD         方法声明
      ElemenetType.PACKAGE        包声明
      ElemenetType.PARAMETER       参数声明
      ElemenetType.TYPE          类,接口(包括注解类型)或enum声明
      ElementType.ANNOTATION_TYPE   注解

    2. @Retention
      @Retention 表示在什么级别保存该注解信息。可选的
      RetentionPolicy 参数包括:
      RetentionPolicy.SOURCE       注解将被编译器丢弃
      RetentionPolicy.CLASS        注解在class文件中可用,但会被VM丢弃
      RetentionPolicy.RUNTIME       JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

    3. @Documented
      @Documented 将此注解包含在 javadoc 中

    4. @Inherited
      @Inherited 允许子类继承父类中的注解

  • 自定义注解

    • 注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。
3、使用注解

下面是一个使用注解注解的实例。

@Description(value="使用注解的实例")
public class TestAnnotation {
}

使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)

如果成员是数组类型,可以通过{}进行赋值,如boolean数组的成员可以设置为{true,false,true}。下面是几个注解标注的例子:

  1. 多成员的注解
@AnnoExample(id= 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody")
  1. 一个成员的注解,成员名为value
    可以省略成员名和赋值符号:
    @Copyright(“Right Reserved”)
    @Copyright(“2011 bookegou.com All Right Reserved”)

  2. 无成员的注解
    @Override

  3. 成员为字符串数组的注解
    @SuppressWarnings(value={“unchecked”,”fallthrough”})
    @SuppressWarnings(value={“unchecked”,”fallthrough”})
  4. 成员为注解数组类型的注解
    @Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer=”df”),
    @Review(grade=Review.Grade.UNSATISFACTORY,reviewer=”eg”,
    comment=”This method needs an @Override annotation”)})
    @Reviews({@Review(grade=Review.Grade.EXCELLENT,reviewer=”df”), @Review(grade=Review.Grade.UNSATISFACTORY,reviewer=”eg”,
    comment=”This method needs an @Override annotation”)})
    @Reviews注解拥有一个@Review注解数组类型的成员,@Review注解类型有三个成员,其中reviewer、comment都是String类型,但comment有默认值,grade是枚举类型的成员。
4、解析注解

下面是一个解析注解的实例。

package java2015.java07.java.anno;
/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年7月23日 下午2:51:27 
 * des:
 */
@Table("student")
public class Filter {

    @Column("id")
    private int stuId;
    @Column("name")
    private String stuName;
    @Column("email")
    private String email;

    public int getStuId() {
        return stuId;
    }
    public void setStuId(int stuId) {
        this.stuId = stuId;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}
package java2015.java07.java.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; 


/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年7月23日 下午2:54:47 
 * des:
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}
package java2015.java07.java.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年7月23日 下午2:54:22 
 * des:
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
  public String value();
}
package java2015.java07.java.anno;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年7月23日 下午3:19:11 
 * des:
 */
public class Test {


    public static void main(String[] args) {

        Filter f1 = new Filter();
        f1.setStuId(10);

        Filter f2 = new Filter();
        f2.setStuId(10);
        f2.setStuName("baoyou");

        Filter f3 = new Filter();
        f3.setEmail("1223716098@qq.com,curiousby@163.com");

        String sql1 = query(f1);
        String sql2 = query(f2);
        String sql3 = query(f3);

        System.out.println(sql1);
        System.out.println(sql2);
        System.out.println(sql3);
    }

    @SuppressWarnings("unchecked")
    private static String query(Filter f) { 
        StringBuffer sb = new StringBuffer();
        Class c=  f.getClass();
        boolean isExist = c.isAnnotationPresent(Table.class);
        if (!isExist) {
            return null;
        }
        Table t = (Table) c.getAnnotation(Table.class);
        String  tableName = t.value();
        sb.append(" select * from ").append(tableName).append(" 1=1 ");
        Field[] fArray = c.getDeclaredFields();
        for (Field field : fArray) {
            boolean fExist = field.isAnnotationPresent( Column.class);
            if (!fExist) {
                continue;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName = column.value();
            String fieldName = field.getName();
            String getMethodName = "get" +fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
            Object fieldValue=null;
            try {
                Method getMethod =c.getMethod(getMethodName);
                fieldValue = getMethod.invoke(f);
            } catch (Exception e) {   
            }
            if (fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0) ) {
                continue;
            }
            sb.append(" and ").append( columnName );
            if (fieldValue instanceof String){
                if (((String) fieldValue ).contains(",")) {
                    String[] values = ((String) fieldValue ).split(",");
                    sb.append(" in ( ");
                    for (String v : values) {
                        sb.append("'").append(v).append("',");
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append(" )");
                } else{
                sb.append(" = '").append(fieldValue).append("' ");
                }
            }else if (fieldValue instanceof Integer){
                sb.append(" = ").append(fieldValue).append(" ");
            }


        }
        return sb.toString();
    }
}

这里写图片描述

参考网站:http://knight-black-bob.iteye.com/blog/2229834
http://www.open-open.com/lib/view/open1353144218545.html
http://www.cnblogs.com/yejg1212/p/3187362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值