在Java中,注解(Annotations)是程序中用來(lái)添加元數(shù)據(jù)(meta-data)的一種方式。元數(shù)據(jù)是一些描述數(shù)據(jù)的信息,如編譯器可以用元數(shù)據(jù)來(lái)判斷是否對(duì)代碼進(jìn)行優(yōu)化。
//示例注解 @Target(ElementType.TYPE) //指定注解使用的目標(biāo)類型 @Retention(RetentionPolicy.RUNTIME) //指定注解保留時(shí)間為運(yùn)行時(shí) public @interface MyAnnotation { //定義元素(成員變量),可以有默認(rèn)值 String value() default ""; int num() default 0; }
在上面的代碼中,我們定義了一個(gè)名為
@Target(ElementType.TYPE)表示該注解只能用于類、接口、枚舉類型。
@Retention(RetentionPolicy.RUNTIME)表示該注解在運(yùn)行時(shí)保留,可以通過(guò)反射機(jī)制獲取該注解的信息。
而注解的元素定義方式與接口相同。
同時(shí),Java還提供了反射機(jī)制,可以在運(yùn)行時(shí)獲取類、對(duì)象的信息。反射機(jī)制的出現(xiàn),為Java提供了更靈活、動(dòng)態(tài)的特性。下面是一個(gè)簡(jiǎn)單的反射示例。
class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, I'm " + name); } } public class Main { public static void main(String[] args) throws Exception { Class cls = Class.forName("Person"); //獲取類對(duì)象 Constructor constructor = cls.getConstructor(String.class, int.class); //獲取構(gòu)造器 Object object = constructor.newInstance("Tom", 20); //創(chuàng)建對(duì)象 Method method = cls.getDeclaredMethod("sayHello"); //獲取方法 method.invoke(object); //調(diào)用方法 } }
在上面的代碼中,我們使用了反射機(jī)制來(lái)創(chuàng)建一個(gè)Person類的對(duì)象,并調(diào)用了Person類中的sayHello方法。通過(guò)反射機(jī)制,我們可以在運(yùn)行時(shí)動(dòng)態(tài)地獲取類信息,這為Java程序的編寫帶來(lái)了非常大的靈活性。