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时会包含注解
- @Target(ElementType.Method,…)
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注解的主要内容,如果未能解决你的问题,请参考以下文章