Java注解

Posted QQ719872578

tags:

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

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注解的主要内容,如果未能解决你的问题,请参考以下文章

ComponentScan注解的扫描范围及源码解析

Java 注解注解简介及作用

java中注解简介

注解与枚举

Java回顾注解

@ComponentScan注解**