注解你可以理解为一个特殊的类,或者接口其自定义个格式形如
public @interface 注解名(){
//注解的属性,特别提醒当注解的属性为value时,在对其赋值时,可以不写value,而直接写上值即可。
}
下面一个例子讲述了注解的基本应用:(这个例子中A代表一个注解类,写一个D注解的目的是说明一个注解类中可以有注解这个属性。B代表应用了注解类的类,C代表对应用了注解类的类进行反射操作的类。)
代码如下://定义一个注解D(D的作用只是为了说明A中可以有一个注解的属性)
package com.qls.theoryIntroduce2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface D {
String[] people() default{"王昭君","西施","阴丽华"};
}
//定义一个注解类A
package com.qls.theoryIntroduce2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**特别说明当一个类引用一个注解时,(如B类引用A注解时)A注解中没有默认值的元素必须要赋值。
*
* 从下面的定义中可以看出A注解中的内容包括:int型带有默认值。
* int型不带有默认值(在一个类中用了A注解,A必须要给caocao这个元素赋一个值)
* 数组,以及注解。
*
* @author 秦林森
*
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
int liubei() default 2;
int caocao();
String[] sunquan() default {"1","2","3","4"};
int[] xiaoqiao();
D daqiao() default @D;
}
//定义一个应用注解的类B
package com.qls.theoryIntroduce2;
@A(caocao=1,xiaoqiao={8,9,10})
public class B {
}
//定义一个对应用注解的类进行反射操作的类:
package com.qls.theoryIntroduce2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* A注解的内容全部都取出来(这里需要用到反射)
* @author 秦林森
*
*/
public class C {
public static void main(String[] args) {
// TODO Auto-generated method stub
//首选判断B类中是否有A注解:
System.out.println(B.class.isAnnotationPresent(A.class));
/**
* 返回结果为true,说明有,但是在A注解中必须有一个元注解
* @Retention(RetentionPolicy.RUNTIME)否则,返回结果为false.
*/
//取出A注解中的值:
A annot = B.class.getAnnotation(A.class);
//取出caocao的值
int caocao = annot.caocao();
System.out.println("caocao="+caocao);
//取出daqiao的值
System.out.println("daqiao的值是:");//newline
for(String str:annot.daqiao().people()){
System.out.print(str+" ");
}
System.out.println();
//取出liubei
int liubei = annot.liubei();
System.out.println("liubei="+liubei);
//取出xiaoqiao的值
System.out.println("xiaoqiao的值是:");
for(int xiaoqiao:annot.xiaoqiao()){
System.out.print(xiaoqiao+" ");
}
//取出孙权的值是:
System.out.println();
System.out.println("sunquan的值是:");
for(String sunquan:annot.sunquan()){
System.out.print(sunquan+" ");
}
}
}/*Output:
true
caocao=1
daqiao的值是:
王昭君 西施 阴丽华
liubei=2
xiaoqiao的值是:
8 9 10
sunquan的值是:
1 2 3 4 *///:~