Java注解

Posted QQ719872578

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java注解相关的知识,希望对你有一定的参考价值。

1.自定义注解语法要求

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

    String desc();
    String author();
    int age()default 18;
}
  • @interface:
    • 成员类型是受限的,合法的类型包括基础数据类型及String、Class、Annotation、Eumeration
    • 如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
    • 注解类可以没有成员,没有成员的注解称为标识注解
    • 成员以无参无异常方式声明,可以使用default为成员指定一个默认值
  • 元注解
    • @Target({ElementType.Method,…})
      • CONSTRUCTOR:构造方法声明
      • FIELD:字段声明
      • LOCAL_VARIABLE:局部变量声明
      • METHOD:方法声明
      • PACKAGE:包声明
      • PARAMETER:参数声明
      • TYPE:类、接口声明
    • @Retention(RetentionPolicy.RUNTIME)
      • SOURCE:只在源码显示,编译时会丢弃
      • CLASS:编译时会记录到class中,运行时忽略
      • RUNTIME:运行时存在,可以通过反射读取
    • @Inherited:允许子类继承
    • @Documented:生成javadoc时会包含注解

2.自定义注解使用

@Description(desc = "I am eyeColor", author = "David", age = 20)
public String eyeColor(){
     return "green";
}
  • @<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,…)

3.注解实战

  • 项目说明
    • 项目取自一个公司的持久层架构,用来代替Hibernate的解决方案,核心代码就是通过注解来实现。
  • 需求
    • 1、有一张用户表,字段包括用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号
    • 2、方便的对每一个字段或字段组合条件进行检索,并打印出SQL。
    • 3、使用方式足够简单

3.1 Table注解(根据实体类映射数据库表)

package com.dao;

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

/**
 * @author hk
 * @title: Table
 * @description:
 * @date 2021/6/24 16:55
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}

3.2 Column 注解(根据字段映射数据库字段)

package com.dao;

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

/**
 * @author hk
 * @title: Column
 * @description:
 * @date 2021/6/24 16:56
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

3.3 JavaBean(只需增加注解映射)

package com.dao;

/**
 * @author hk
 * @title: Filter
 * @description:
 * @date 2021/6/24 16:53
 */
@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;
    }
}

3.4 测试类

package com.dao;

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

/**
 * @author hk
 * @title: Test
 * @description:
 * @date 2021/6/24 16:58
 */
public class Test {

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

        Filter f2 = new Filter();
        f2.setUserName("Devid");//查询用户为Divid的用户

        Filter f3 = new Filter();
        f3.setEmail("zhang@sina.com, zhang@163.com, zhang@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);
    }

    private static String query(Filter f) {
        StringBuilder sb = new StringBuilder();
        //1.获取到class
        Class c = f.getClass();
        //2.获取到table的名字
        boolean isExists = c.isAnnotationPresent(Table.class);
        if (!isExists){
            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 fExists = field.isAnnotationPresent(Column.class);
            if (!fExists){
                continue;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName = column.value();
            //4.2拿到字段的值
            String fieldName = field.getName();
            String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
            Object fieldValue = null;
            try {
                Method getMethod = c.getMethod(getMethodName, null);
                fieldValue = getMethod.invoke(f, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //4.3拼装SQL
            if (fieldValue==null || (fieldValue instanceof Integer && (Integer) fieldValue == 0)){
                continue;
            }
            sb.append(" and ").append(fieldName);
            if (fieldValue instanceof String){
                String filedResult = (String)fieldValue;
                if (filedResult.contains(",")){
                    String[] values = filedResult.split(",");
                    sb.append(" in(");
                    for (String value:values) {
                        sb.append("'").append(value).append("'").append(",");
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append(")");
                }else{
                    sb.append("=").append("'").append(fieldValue).append("'");
                }
            }else if (fieldValue instanceof Integer){
                sb.append("=").append(fieldValue);
            }
        }

        return sb.toString();
    }
}

以上是关于Java注解的主要内容,如果未能解决你的问题,请参考以下文章

JAXB的@XmlElement注解

java代码在片段活动中不起作用

Android APT注解处理器 ( 根据注解生成 Java 代码 )

java 代码片段【JAVA】

# Java 常用代码片段

# Java 常用代码片段