手记

Java系列:全面解析Java注解

一、Java注解基础知识点
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
二、JAVA 注解
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
三、元数据的作用
如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查
四、读取注解信息的方法
属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度
注意:要想使用反射去读取注解,必须将Retention的值选为Runtime


```Java代码
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

//读取注解信息
public class ReadAnnotationInfoTest {
    public static void main(String[] args) throws Exception {
        // 测试AnnotationTest类,得到此类的类对象
        Class c = Class.forName("com.iwtxokhtd.annotation.AnnotationTest");
        // 获取该类所有声明的方法
        Method[] methods = c.getDeclaredMethods();
        // 声明注解集合
        Annotation[] annotations;
        // 遍历所有的方法得到各方法上面的注解信息
        for (Method method : methods) {
            // 获取每个方法上面所声明的所有注解信息
            annotations = method.getDeclaredAnnotations();
            // 再遍历所有的注解,打印其基本信息
            System.out.println(method.getName());
            for (Annotation an : annotations) {
                System.out.println("方法名为:" + method.getName() + "其上面的注解为:" + an.annotationType().getSimpleName());
                Method[] meths = an.annotationType().getDeclaredMethods();
                // 遍历每个注解的所有变量
                for (Method meth : meths) {
                    System.out.println("注解的变量名为:" + meth.getName());
                }
            }
        }
    }
}

五、代码实例

package com.test;

@Table("user")
public class Filter {
    @Column("id")
    private int id;
    @Column("userName")
    private String userName;
    @Column("nickName")
    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 getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}
package com.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.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.test;

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

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

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

        Filter f3=new Filter();
        f3.setEmail("785713526@qq.com,liu@sina.com,7777@qq.com");

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

    private static String query(Filter f) {
        StringBuilder stringBuilder=new StringBuilder();
        //获取到class
        Class c=f.getClass();
        //获取到Table的名字
        boolean exists = c.isAnnotationPresent(Table.class);
        if (!exists){
            return null;
        }
        Table t = (Table) c.getAnnotation(Table.class);
        String tableName=t.value();
        stringBuilder.append("select * from ").append(tableName).append("where 1=1");
        //遍历所有的字段
        Field[] fArray=c.getDeclaredFields();
        for (Field field:fArray){
            //处理每个字段对应的SQL
            //拿到字段名
            boolean fExists=field.isAnnotationPresent(Column.class);
            if(!fExists){
                continue;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName=column.value();
            //拿到字段的值
            String filedName=field.getName();
            String getMethodName="get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
            Object fieldValue=null;
            try {
                Method getMethod=c.getMethod((getMethodName));
                fieldValue=getMethod.invoke(f);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //拼接SQL
            if (fieldValue==null||(fieldValue instanceof Integer&&(Integer)fieldValue==0)) continue;
            stringBuilder.append(" and ").append(filedName);
            if (fieldValue instanceof String){
                if (((String) fieldValue).contains(",")){
                    String[] values=((String) fieldValue).split(",");
                    stringBuilder.append(" in(");
                    for (String v : values){
                        stringBuilder.append("'").append(v).append("'").append(",");
                    }
                    stringBuilder.deleteCharAt(stringBuilder.length()-1);
                    stringBuilder.append(")");
                }else {
                    stringBuilder.append("=").append("'").append(fieldValue).append("'");
                }
            } else if (fieldValue instanceof Integer){
                stringBuilder.append("=").append(fieldValue);
            }
        }
        System.out.println(stringBuilder.toString());
        return stringBuilder.toString();
    }
}
1人推荐
随时随地看视频
慕课网APP