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