1. 程式人生 > 資料庫 >SQL語句優化

SQL語句優化

技術標籤:Java

目錄

Annotation

JDK自帶註解

自定義註解

註解使用

@Target

@Retention

解析註解


Annotation

Annotation註解是一種新的型別,與介面很相似,它與類、介面、列舉是平級的。註解相當於是一種標記,以@符號開頭。一般寫作@xxx,可以宣告在類、屬性、方法和引數等的前面。

用來對這些元素進行說明,標註或實現特定功能

JDK自帶註解

在java.lang包中

註解

作用

@Override

標記在方法前面,表示該方法是重寫父類的方法

@Deprecated

標記在類、屬性、方法等,表示該內容已過時,不建議使用

@SuppressWarning

標記在類、屬性、方法等,用來關閉某些警告資訊

自定義註解

使用@interface 關鍵字 + 元註解(標註在註解上的註解)

public @interface 註解名{
//抽象方法
}

註解

作用

@Target

定義註解的作用域,即可以被標記在哪些元素上,通過列舉型別ElementType來取值,省略時表示可以宣告在任何元素前面。

@Retention

用來定義註解的生命週期, 通過列舉型別RetentionPolicy來取值

@Document

用來指定使用javadoc生成API文件時是否包含該註解資訊

@Inheried

指定允許子類繼承父類中的註解

註解使用

語法: @註解名(屬性名=屬性值,屬性名=屬性值)

  1. 在使用註解時需要為註解中的抽象方法指定返回值,也稱為為註解指定屬性值
  2. 屬性名就是註解中抽象方法的名稱

@Target

表示作用域的取值範圍 如果省略不寫的話 表示可以宣告在任何前面:

TYPE:類、介面
FIELD 屬性
METHOD 方法
PARAMETER 引數
Construcor 構造方法

@Target({ElementType.TYPE, ELementType.FIELD, ELementType.PARAMETER}) //可以同時指定多個值,需要將多個值放大括號中,以逗號隔開

@Retention

表示定義註解的生命週期@Retention(

RetentionPolicy.SOURCE)

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);


    }
}