手機(jī)點(diǎn)了釣魚網(wǎng)站怎么辦查詢網(wǎng)址域名ip地址
概述
注解是對程序代碼進(jìn)行標(biāo)注和解釋的一種方式。在Java中,注解提供了一種元數(shù)據(jù)形式,能夠在程序中嵌入有關(guān)程序的信息,以便進(jìn)行進(jìn)一步的處理。注解通過使用@
符號來聲明,如@Override
、@Deprecated
等。
注解和注釋的區(qū)別
- 注釋:是給程序員看的,不會對程序產(chǎn)生任何影響。
- 注解:是給編譯器或其他工具看的,可以在編譯、運(yùn)行時(shí)進(jìn)行一些特殊操作。
使用注解進(jìn)行配置的優(yōu)勢
使用注解進(jìn)行配置能使代碼更簡潔、方便,而不再需要繁瑣的配置文件。注解能夠直觀地標(biāo)識出程序中的關(guān)鍵信息,提高代碼的可讀性和可維護(hù)性。
自定義注解
格式
javaCopy codepublic @interface 注解名稱 {public 屬性類型 屬性名() default 默認(rèn)值;
}
屬性類型
- 基本數(shù)據(jù)類型
- String
- Class
- 注解
- 枚舉
- 以上類型的一維數(shù)組
示例代碼
javaCopy codepublic @interface Anno2 {
}public enum Season {SPRING, SUMMER, AUTUMN, WINTER;
}public @interface Anno1 {// 定義一個(gè)基本類型的屬性int a() default 23;// 定義一個(gè)String類型的屬性String name() default "shizhanban";// 定義一個(gè)Class類型的屬性Class clazz() default Anno2.class;// 定義一個(gè)注解類型的屬性Anno2 anno() default @Anno2;// 定義一個(gè)枚舉類型的屬性Season season() default Season.SPRING;// 以上類型的一維數(shù)組// int數(shù)組int[] arr() default {1, 2, 3, 4, 5};// 枚舉數(shù)組Season[] seasons() default {Season.SPRING, Season.SUMMER};// value。后期我們在使用注解的時(shí)候,如果我們只需要給注解的value屬性賦值。// 那么value就可以省略String value();
}// 在使用注解的時(shí)候如果注解里面的屬性沒有指定默認(rèn)值。
// 那么我們就需要手動給出注解屬性的設(shè)置值。
//@Anno1(name = "shizhanban")
@Anno1("abc")
public class AnnoDemo {
}
注意
如果只有一個(gè)屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義值即可。
自定義注解案例
需求
自定義一個(gè)注解@Test,用于指定類的方法上,如果某一個(gè)類的方法上使用了該注解,就執(zhí)行該方法。
實(shí)現(xiàn)步驟
- 自定義一個(gè)注解
Test
,并在類的某幾個(gè)方法上加上注解。 - 在測試類中,獲取注解所在類的
Class
對象。 - 獲取類中所有的方法對象。
- 遍歷每一個(gè)方法對象,判斷是否有對應(yīng)的注解。
javaCopy code// 表示Test這個(gè)注解的存活時(shí)間
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Test {
}public class UseTest {// 沒有使用Test注解public void show() {System.out.println("UseTest....show....");}// 使用Test注解@Testpublic void method() {System.out.println("UseTest....method....");}// 沒有使用Test注解@Testpublic void function() {System.out.println("UseTest....function....");}
}public class AnnoDemo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {// 1.通過反射獲取UseTest類的字節(jié)碼文件對象Class clazz = Class.forName("com.shizhanban.UseTest");// 創(chuàng)建對象UseTest useTest = (UseTest) clazz.newInstance();// 2.通過反射獲取這個(gè)類里面所有的方法對象Method[] methods = clazz.getDeclaredMethods();// 3.遍歷數(shù)組,得到每一個(gè)方法對象for (Method method : methods) {// method依次表示每一個(gè)方法對象。// isAnnotationPresent(Class<? extends Annotation> annotationClass)// 判斷當(dāng)前方法上是否有指定的注解。// 參數(shù):注解的字節(jié)碼文件對象// 返回值:布爾結(jié)果。 true 存在 false 不存在if (method.isAnnotationPresent(Test.class)) {method.invoke(useTest);}}}
}
元注解
概述
元注解是描述注解的注解。
元注解介紹
@Target
:指定了注解能在哪里使用。@Retention
:可以理解為保留時(shí)間(生命周期)。@Inherited
:表示修飾的自定義注解可以被子類繼承。@Documented
:表示該自定義注解會出現(xiàn)在API文檔里面。
示例代碼
javaCopy code@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) // 指定注解使用的位置(成員變量,類,方法)
@Retention(RetentionPolicy.RUNTIME) // 指定該注解的存活時(shí)間
// @Inherited // 指定該注解可以被繼承
public @interface Anno {
}@Anno
public class Person {
}public class Student extends Person {public void show() {System.out.println("student.......show..........");}
}public class StudentDemo {public static void main(String[] args) throws ClassNotFoundException {// 獲取到Student類的字節(jié)碼文件對象Class clazz = Class.forName("com.shizhanban.Student");// 獲取注解。boolean result = clazz.isAnnotationPresent(Anno.class);System.out.println(result);}
}
通過元注解,我們可以更加靈活地定義和使用自定義注解,控制注解的生命周期和作用范圍。