注解分類(lèi)
1、代碼注解
2围辙、編譯時(shí)注解
3我碟、運(yùn)行時(shí)注解
- 注解范例
package com.alan.oa.biz.test;
import java.lang.annotation.*;
/**
* 通過(guò)@interface關(guān)鍵字定義注解
*/
//源注解,@Target 說(shuō)明此注解可以作用的相關(guān)區(qū)域姚建,例如方法上類(lèi)矫俺,接口上。
@Target({ElementType.METHOD,ElementType.FIELD})
/*
* @Retention生命周期
* 1掸冤、RetentionPolicy.SOURCE 只在源碼顯示厘托,編譯時(shí)會(huì)丟棄
* 2、RetentionPolicy.CLASS 編譯時(shí)會(huì)記錄到class中稿湿,運(yùn)行時(shí)忽略
* 3铅匹、RetentionPolicy.RUNTIME 運(yùn)行時(shí)存在,可以通過(guò)反射讀取
*/
@Retention(RetentionPolicy.RUNTIME)
// 允許子類(lèi)只注解來(lái)繼承
@Inherited
// javadoc *.java 時(shí)會(huì)包含注解
@Documented
public @interface AnnotationDemo1 {
// 成員的類(lèi)型是受限的饺藤,合法的類(lèi)型包括原始類(lèi)型及String,Class,Annotation,Enumeration
// 如果注解只有一個(gè)成員包斑,則成員名必須取名為value(),在使用時(shí)可以忽略成員名和賦值號(hào)(=)
// 注解類(lèi)可以沒(méi)用成員,沒(méi)有成員的注解成為標(biāo)識(shí)注解
// 成員以無(wú)參無(wú)異常方式聲明
String desc();
String author();
// 可以用default為成員指定一個(gè)默認(rèn)值
int age() default 18;
}
- 使用注解的類(lèi)
package com.alan.oa.biz.test;
@AnnotationDemo1("我是類(lèi)注解")
public class Demo1 {
// 使用剛才定義的注解
@AnnotationDemo1("我是方法注解")
public String eyeColor(){
return "red";
}
// 使用剛才定義的注解
@AnnotationDemo1("我是方法注解222")
public String eyeColor1(){
return "red";
}
}
- 注解解析類(lèi)
package com.alan.oa.biz.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* 對(duì)注解進(jìn)行解析的類(lèi)
*/
public class ParseAnn {
public static void main(String[] args) {
// 1涕俗、使用類(lèi)加載器加載類(lèi)
try {
Class c = Class.forName("com.alan.oa.biz.test.Demo1");
// 2罗丰、找到類(lèi)上面的注解 判斷當(dāng)前類(lèi)是否存在AnnotationDemo1注解
boolean annotationPresent = c.isAnnotationPresent(AnnotationDemo1.class);
if(annotationPresent){
//3、拿到注解實(shí)例
AnnotationDemo1 annotation = (AnnotationDemo1) c.getAnnotation(AnnotationDemo1.class);
System.out.println(annotation.value());
}
// 4咽袜、找到方法上的注解,注意這里是方法數(shù)組
Method[] method = c.getMethods();
for(Method m:method){
boolean annotationPresent1 =m.isAnnotationPresent(AnnotationDemo1.class);
if(annotationPresent1){
AnnotationDemo1 annotation = m.getAnnotation(AnnotationDemo1.class);
System.out.println(annotation.value());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
注解實(shí)戰(zhàn)
需求
1丸卷、有一張用戶表,字段包括用戶id,用戶名询刹,昵稱(chēng)谜嫉,年齡萎坷,性別,所在城市沐兰,郵箱哆档,手機(jī)號(hào)。
2住闯、方便的對(duì)每個(gè)字段或字段的組合條件進(jìn)行檢索瓜浸,并打印出sql。
3比原、使用方式足夠簡(jiǎn)單插佛。實(shí)體類(lèi)
package com.alan.oa.biz.test;
/**
* 通過(guò)自定義注解映射數(shù)據(jù)庫(kù)表和字段
*/
@Table("user")
public class Fliter {
@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;
//getter和setter方法
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;
}
}
- 注解類(lèi)
package com.alan.oa.biz.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.alan.oa.biz.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();
}
- 注解解析類(lèi)
package com.alan.oa.biz.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class FilterTest {
public static void main(String[] args) {
// 查詢id為10的用戶
Fliter f1 = new Fliter();
f1.setId(10);
// 查詢姓名為lucy的用戶
Fliter f2 = new Fliter();
f2.setUserName("lucy");
//查詢郵箱為其中任意一個(gè)的用戶
Fliter f3 = new Fliter();
f3.setEmail("liu@sina.com,zh@163.com,77777@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(Fliter f){
StringBuilder sb = new StringBuilder();
// 1、獲取到class
Class c = f.getClass();
// 2量窘、獲取到table的名字
boolean annotationPresent = c.isAnnotationPresent(Table.class);
if(annotationPresent)
{
Table t = (Table) c.getAnnotation(Table.class );
String tableName = t.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
}
// 3雇寇、遍歷所有的字段
Field[] fields = c.getDeclaredFields();
for(Field field:fields){
// 4、處理每個(gè)字段對(duì)應(yīng)的sql
// 4.1蚌铜、拿到字段名
boolean annotationPresent1 = field.isAnnotationPresent(Column.class);
String columnValue = null;
if(annotationPresent1){
Column column = field.getAnnotation(Column.class);
columnValue = column.value();
}
//4.2锨侯、拿到字段的值
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 (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//4.3、拼裝sql
if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)) {
continue;
}
sb.append(" and ").append(columnValue);
if(fieldValue instanceof String){
if(((String) fieldValue).contains(",")){
String[] values = ((String) fieldValue).split(",");
sb.append(" in(");
for(String str:values){
sb.append("'").append(str).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}else {
sb.append("=").append("'").append(fieldValue).append("'");
}
}else {
sb.append("=").append(fieldValue);
}
}
return sb.toString();
}
}