註解的分類:(按照運行機制來分類)
1,源碼註解
2,編譯時註解(JDK自帶註解: Override, Deprecated, Suppvisewarnings)
3,運行時註解 (在運行階段起作用,可能會運行編譯的邏輯,例如 Autowired)
按照來源分類:
1,JDK自帶的註解
2,第三方的註解
3,自定義註解
自定義註解的語法:
成員類型是受限制的,只能是JAVA的8個基本類型,String,Class,Annotation,Enumberation。
可以沒有成員,沒有成員的註解稱爲標記註解。
public @interface Table {//用關鍵字@interface,成員以無參無異常的方式聲明
/**
* 成員以無參無異常的方式聲明
* @return
*/
String dec();
/**
* 只有一個成員時用規定用value(用其它的也不會報錯)
* @return
*/
String value();
/**
* 可以用default設置一個默認值
* @return
*/
int age() default 18;
}
元註解:
1,註解的作用域
@Target ()
值:ElementType.Method 方法聲明
ElementType.CONSTRUCTOR 構造方法聲明
ElementType.FIELD 字段聲明
ElementType.LOCAL_VARIABLE 局部變量聲明
ElementType.PACKAGE 包聲明
ElementType.PARAMETER 參數聲明
ElementType.TYPE 類,接口聲明
2,註解的生命週期
@Retention()
值:RetentionPolicy.SOURCE 只在源碼中顯示,編譯時會丟棄
RetentionPolicy.CLASS 編譯時會記錄到CLASS中,
RetentionPolicy.RUNTIME 運行時存在,可以通過反射來讀取
3,允許被子類繼承
@Inherited
4,生成JAVADOC時會包含註解
@Documented
註解的使用方法:
@<註解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,......)
eg:
@Desc(desc="hello", name="tom", age=18)
解析註解:
概念:通過反射獲取類、函數或成員上的運行時(生命週期爲RUNTIME)註解信息,從而實現動態控制程序運行的邏輯
這是一個拼接sql的函數
public static String f(User user){
StringBuffer sb = new StringBuffer();
//獲取類
Class c = user.getClass();
//判斷類上是否有註解Table
boolean tExist = c.isAnnotationPresent(Table.class);
if(!tExist){
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
//獲取註解成員值
sb.append("select * from ").append(t.value()).append(" where 1 = 1 ");
//獲取類的成員
Field[] fArray = c.getDeclaredFields();
//遍歷成員
for (Field field : fArray) {
boolean fExist = field.isAnnotationPresent(Column.class);
if(!fExist){
continue;
}
//獲取註解實例
Column col = field.getAnnotation(Column.class);
//獲取註解成員值
String columnName = col.value();
String fieldName = field.getName();
//獲取類中成員的get方法名
String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1, fieldName.length());
Method m;
Object columnValue;
try {
m = c.getMethod(methodName);
//執行方法,獲取類中的成員值
columnValue = m.invoke(user);
if(columnValue == null){
continue;
}
sb.append(" and ").append(columnName).append(" = ");
if(columnValue instanceof String){
sb.append("'");
}
sb.append(columnValue);
if(columnValue instanceof String){
sb.append("'");
}
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sb.toString();
}