java元注解和自定義注解的區(qū)別
Java的自定義注解是一種元數(shù)據(jù),可以應(yīng)用于類(lèi)、方法、字段等程序元素上,以提供額外的信息或指示。
????????自定義注解包括注解聲明、元注解、運(yùn)行時(shí)處理器三個(gè)部分。注解聲明指定了注解的名稱(chēng)、作用域、成員等信息;元注解則用來(lái)對(duì)注解進(jìn)行修飾;運(yùn)行時(shí)處理器則負(fù)責(zé)在程序運(yùn)行過(guò)程中處理注解,并根據(jù)注解提供的信息執(zhí)行相應(yīng)的邏輯。自定義注解在編寫(xiě)框架、插件等開(kāi)發(fā)時(shí)非常常見(jiàn),可以為代碼提供更多的靈活性和可擴(kuò)展性。
自定義注解類(lèi)可以通過(guò)以下步驟使用:
-
定義注解類(lèi),指定注解的元素和屬性。
-
在需要使用注解的地方,使用@注解名稱(chēng)來(lái)標(biāo)注目標(biāo)元素,可以是類(lèi)、方法、字段等程序元素。
-
可以使用反射機(jī)制獲取注解,并對(duì)注解進(jìn)行處理。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-435094.html
例如,定義一個(gè)自定義注解類(lèi):
import java.lang.annotation.*;
/**
* @Description
* @Author 劉品水
* @Data 2023/5/5 18:44
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
String value() default "";
int num() default 0;
}
然后在代碼中使用該注解:
/**
* @Description
* @Author 劉品水
* @Data 2023/5/5 18:44
*/
@MyAnnotation(value = "Hello 阿水!", num = 1314)
public class MyClass {
@MyAnnotation("阿水")
private String name;
@MyAnnotation(num = 666,value = "聞道有先后,術(shù)業(yè)有專(zhuān)攻~")
public void myMethod() {
// Do something you want to do!
}
@MyAnnotation(value = " ")
public void myMethod2() {
// Do something you want to do!
}
}
可以通過(guò)反射獲取注解并處理:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description
* @Author 劉品水
* @Data 2023/5/5 18:46
*/
public class MyTest {
public static void main(String[] args) throws Exception {
// 獲取類(lèi)上的注解
MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
System.out.println("獲取類(lèi)上的注解value值:"+classAnnotation.value()); // 輸出:Hello 阿水!
System.out.println("獲取類(lèi)上的注解num值:"+classAnnotation.num()); // 輸出:1314
// 獲取字段上的注解
Field field = MyClass.class.getDeclaredField("name");
MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
System.out.println("獲取類(lèi)上的注解value值:"+fieldAnnotation.value()); // 輸出:阿水
System.out.println("獲取類(lèi)上的注解num值:"+fieldAnnotation.num()); // 輸出:0
// 獲取方法上的注解
Method method = MyClass.class.getDeclaredMethod("myMethod");
MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
System.out.println("獲取myMethod方法上的注解value值:"+methodAnnotation.value()); // 輸出:聞道有先后,術(shù)業(yè)有專(zhuān)攻~
System.out.println("獲取myMethod方法上的注解num值:"+methodAnnotation.num()); // 輸出:666
// 獲取方法上的注解
Method method2 = MyClass.class.getDeclaredMethod("myMethod2");
MyAnnotation methodAnnotation2 = method2.getAnnotation(MyAnnotation.class);
System.out.println("獲取myMethod2方法上的注解value值:"+methodAnnotation2.value()); // 輸出:
System.out.println("獲取myMethod2方法上的注解num值:"+methodAnnotation2.num()); // 輸出:0
}
}
注意:自定義注解類(lèi)必須要有@Retention和@Target元注解,@Retention指定注解的保留策略,@Target指定注解可以應(yīng)用到哪些元素上。在這里,我們使用RUNTIME保留策略表示注解在運(yùn)行時(shí)仍然有效,并且使用TYPE和METHOD作為注解的目標(biāo)元素。
Java自定義注解類(lèi)使用注意事項(xiàng)
????????在使用Java自定義注解類(lèi)時(shí),需要注意以下幾點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-435094.html
-
注解元素類(lèi)型:自定義注解中的元素類(lèi)型必須是基本數(shù)據(jù)類(lèi)型、String、Class、枚舉類(lèi)型或者其他注解類(lèi)型。
-
注解屬性默認(rèn)值和賦值:自定義注解中的屬性可以設(shè)置默認(rèn)值,但在使用注解時(shí)可以不指定該屬性的值。如果需要給屬性賦值,則必須按照屬性名=屬性值的格式進(jìn)行賦值。
-
自定義注解可以使用反射機(jī)制來(lái)獲取和處理,因此要保證注解中的元素符合Java語(yǔ)言規(guī)范,不會(huì)導(dǎo)致編譯錯(cuò)誤。
-
可以使用元注解@Retention和@Target來(lái)指定注解的保留策略和目標(biāo)范圍。一般情況下,@Retention應(yīng)該設(shè)置為RUNTIME,@Target應(yīng)該根據(jù)需要選擇適當(dāng)?shù)哪繕?biāo)類(lèi)型。
-
在使用注解時(shí),應(yīng)該遵循注解的語(yǔ)法規(guī)則,即使用 "@" 符號(hào)后跟著注解名稱(chēng),并在括號(hào)中指定注解屬性和值。如果需要使用多個(gè)注解,則可以將它們放在同一個(gè)目標(biāo)元素上,或者使用Java 1.8新增的@Repeatable注解。
????????總之,在使用Java自定義注解時(shí),需要遵守Java語(yǔ)法規(guī)范和注解的語(yǔ)法規(guī)則,注意注解元素類(lèi)型、屬性默認(rèn)值和賦值、保留策略、目標(biāo)類(lèi)型等細(xì)節(jié)問(wèn)題,才能保證注解的正確性和有效性。同時(shí)也需要理解注解的原理和機(jī)制,才能更好地應(yīng)用自定義注解處理程序邏輯。
到了這里,關(guān)于Java的自定義注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!