java 注解理解

Android注解

参考:http://www.jianshu.com/p/9ca78aa4ab4d
http://swiftlet.net/archives/1906
慕课网(java注解)

元注解是什么

元注解是由java提供的基础注解,负责注解其它注解

这是重载的注解源码:

JDK5时支持的元注解有

  • @Documented
  • @Retention
  • @Target
  • @Inherited
@Documented 文档注解

Documented是一个标记注解,没有成员。
@Documented 被修饰的注解会生成到javadoc中

@Retention 周期注解

周期注解就是注解的注册生命周期。

Retention注解的值是enum类型的RetentionPolicy。包括如下几种情况:

  • SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。Annotations are to be discarded by the compiler.
  • CLASS: 注解被保留到class文件,jvm加载class文件时候被遗弃。这是默认的生命周期。
    Annotations are to be recorded in the class file by the compiler
    but need not be retained by the VM at run time. This is the default
    behavior.
  • RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,保存到class对象中,可以通过反射来获取。
    Annotations are to be recorded in the class file by the compiler and
    retained by the VM at run time, so they may be read reflectively.

@Target 注解修饰类型

注解需要标明注解的修饰目标,这些信息是通过元注解实现。

这个注解的值是enum类型ElementType。包括以下几种情况:

  • TYPE:指的是在类,接口(包括注解)或者enum上使用的注解。
  • FIELD:指的在field属性,也包括enum常量使用的注解。
  • METHOD:指的是在方法声明上使用的注解。
  • PARAMETER:指的是在参数上使用的注解。
  • CONSTRUCTOR: 指的是在构造器使用的注解。
  • LOCAL_VARIABLE:指的是在局部变量上使用的注解。
  • ANNOTATION_TYPE:指的是在注解上使用的元注解。
  • PACKAGE:指的是在包上使用的注解。

@Inherited

加上这个元注解,可以允许子类继承父类的注解。如下面的例子中
如果没有加上这个元注解,Child类

@Description("I am super class annotation")
public class Person{

    private String name;

    public void  setName(String name){
        this.name=name;
    } 

    public String  getName(){
        return name;
    } 

}


public class Child extend Person{
    public String name(){
        return null;
    }
}

Class c =Class.forName("xxxx.xxx.xxx.Child");
boolean exist = c.isAnnotationPresent(Description.class);
if(!exist){
    Description d = (Description) c.getAnnotation(Description.class);
    String dValue = d.value();
}

输出:I am super class annotation

自定义注解

解析注解

新建一个注解类

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Description {
    String value();
}

新建一个实体

@Description("I am class annotation")
public class Child extends Person{
    @Override
    @Description("I am method annotation")
    public String name(){
        return null;
    }
}

解析注解

Class c =Class.forName("xxxx.xxx.xxx.Child");
boolean exist = c.isAnnotationPresent(Description.class);
if(!exist){
    Description d = (Description) c.getAnnotation(Description.class);
    String dValue = d.value();
}

自定义注解实例

根据注解自动生成sql语句

创建两个注解 @Table @Column

package com.imooc.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}


package com.imooc.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}

创建实体

package com.imooc.test;

@Table("user")
public class Filter {
    @Column("id")
    private int id;
    @Column("user_name")
    private String userName;
    @Column("nick_name")
    private String nickName;
    @Column("age")
    private  int age;
    @Column("city")
    private String city;
    @Column("email")
    private String email;
    @Column("mobile")
    private String mobile;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

}

测试

package com.imooc.test;

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

public class Test {
    public static void main(String[] args) {
        Filter f1 = new Filter();
        f1.setId(10);//查询id为10的用户

        Filter f2 = new Filter();
        f2.setUserName("lucy");//模糊查询用户名为lucy的用户
        f2.setAge(20);

        Filter f3 = new Filter();
        f3.setEmail("liu@sina.com,zh@163.com,77777@qq.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);

        System.out.println("*******************");

        Filter2 f4 = new Filter2();
        f4.setAmount(100);
        f4.setLeader("大王");
        f4.setName("学习部");

        System.out.println(query(f4));
    }
    @SuppressWarnings({ "unchecked", "unused" })
    private static String query(Object f){
        StringBuilder sb = new StringBuilder();
        //1.获取到class
        Class c = f.getClass();
        //2.获取到table的名字
        boolean exist = c.isAnnotationPresent(Table.class);
        if(!exist){
            return null;
        }

        Table t = (Table) c.getAnnotation(Table.class);
        String tableName = t.value();
        sb.append("select * from ").append(tableName).append(" where 1=1");
        //3.遍历所有的字段名
            Field[] fArray = c.getDeclaredFields();
            for(Field field:fArray){
        //4.处理每个字段对应的sql
        //4.1拿到字段名
                boolean fExist = field.isAnnotationPresent(Column.class);
                if(!fExist){
                    continue;
                }
                Column column = field.getAnnotation(Column.class);
                String columnName = column.value();
                //System.out.println(columnName);
        //4.2拿到字段的值
            String fieldName = field.getName(); 
            //System.out.println(fieldName);
            String getMethodName = "get"+fieldName.substring(0, 1).toUpperCase()+
            fieldName.substring(1);//拿到字段名,第一个字母变大写,其余的直接拼接在后面 getXxxxx();
            Object fieldValue = null;
            try {
                Method getMethod = c.getMethod(getMethodName);//通过反射取得字段的值

                 fieldValue =  getMethod.invoke(f);
                }
                catch (Exception e) {
                // TODO Auto-generated catch block
            } 
        //4.3拼接sql
            if(fieldValue==null||
                    (fieldValue instanceof Integer && (Integer)fieldValue==0 )){
                continue;
            }
            sb.append(" and ");
            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("'").append(",");
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append(")");
                }else{
                sb.append(columnName).append("=").append("'").append(fieldValue).append("'");
                }
            }else if(fieldValue instanceof Integer){
                sb.append(columnName).append("=").append(fieldValue);
            }
        }
        return sb.toString();   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值