SQL語句優化
技術標籤:Java
目錄
Annotation
Annotation註解是一種新的型別,與介面很相似,它與類、介面、列舉是平級的。註解相當於是一種標記,以@符號開頭。一般寫作@xxx,可以宣告在類、屬性、方法和引數等的前面。
用來對這些元素進行說明,標註或實現特定功能。
JDK自帶註解
在java.lang包中
註解 | 作用 |
@Override | 標記在方法前面,表示該方法是重寫父類的方法 |
@Deprecated | 標記在類、屬性、方法等,表示該內容已過時,不建議使用 |
@SuppressWarning | 標記在類、屬性、方法等,用來關閉某些警告資訊 |
自定義註解
使用@interface 關鍵字 + 元註解(標註在註解上的註解)
public @interface 註解名{
//抽象方法
}
註解 | 作用 |
@Target | 定義註解的作用域,即可以被標記在哪些元素上,通過列舉型別ElementType來取值,省略時表示可以宣告在任何元素前面。 |
@Retention | 用來定義註解的生命週期, 通過列舉型別RetentionPolicy來取值 |
@Document | 用來指定使用javadoc生成API文件時是否包含該註解資訊 |
@Inheried | 指定允許子類繼承父類中的註解 |
註解使用
語法: @註解名(屬性名=屬性值,屬性名=屬性值)
- 在使用註解時需要為註解中的抽象方法指定返回值,也稱為為註解指定屬性值
- 屬性名就是註解中抽象方法的名稱
@Target
表示作用域的取值範圍 如果省略不寫的話 表示可以宣告在任何前面:
TYPE | :類、介面 |
FIELD | 屬性 |
METHOD | 方法 |
PARAMETER | 引數 |
Construcor | 構造方法 |
@Target({ElementType.TYPE, ELementType.FIELD, ELementType.PARAMETER}) //可以同時指定多個值,需要將多個值放大括號中,以逗號隔開
@Retention
表示定義註解的生命週期@Retention(
SOURCE | 註解保留原始檔中,不參與編譯,即class檔案中沒有 |
CLASS | 註解會參與編譯,會保留在class檔案中,但在類載入時不載入,程式執行的時候沒有(JDK自帶的幾個都是這種型別) |
RUNTIME | 可以保留在程式的執行期間,記憶體中有,可以通過反射來獲取註解並實現相應的功能。一般自定義註解都為這種 |
舉例
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnocation{
/*
*抽象方法,必須是無參無異常
*/
String a();
int b();
String[] c; 為陣列賦值時,需用大括號進行分開
//使用default關鍵字為方法指定預設的返回值,在使用註解時可以不指定該屬性
String d() default “ddd”;
}
public class Student{
@MyAnnotation(a=”aaa”, b=66, c={“a”,”b”,“c”}) //為註解中的a屬性和b屬性進行賦值
private String name;
public void show(int age){
}
}
當沒有屬性需要賦值的時候,可以連小括號都省了。推薦定義方法時的方法名設定為value(),在賦值時如果只為該屬性賦值,則可以省略value=,如果同時為多個屬性賦值,則不能省略value=
解析註解
對於生命週期為執行期間(RententionPolicy.RUNTIME)的註解,可以通過反射獲取元素上的註解,實現特定的功能。
package com.spring;
import com.spring.annotation.MyAnnotation;
import com.spring.pojo.Student;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AnnotationTest {
public static void main(String[] args) throws Exception {
Class clazz = Student.class;
Annotation[] annotations = clazz.getAnnotations();
//獲得指定註解
Annotation annotation = clazz.getAnnotation(MyAnnotation.class);
//獲取屬性上的註解
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
annotations = field.getAnnotations();
annotation = field.getAnnotation(MyAnnotation.class);
System.out.println("屬性name上的註解" + annotation);
//通過反射獲取註解的屬性值
if(annotation instanceof MyAnnotation){
MyAnnotation ma = (MyAnnotation) annotation;
System.out.println(ma.a());
System.out.println(ma.b());
System.out.println(ma.d());
}
//獲取方法上的註解
Method method = clazz.getMethod("show");
annotations = method.getAnnotations();
annotation = method.getAnnotation(MyAnnotation.class);
}
}