注解:也指元数据,在代码中添加信息提供的一种形式化方法。
Java SE5内置了三种标准注解:
@Override,@Deprecated,@SuppressWarnings.
四种元注解:
@Target,@Retention,@Documented,@Inherited.
@Target表示可用于什么地方,ElementType包含有:
类、接口(包括注释类型)或枚举声明:ElementType.TYPE
字段声明(包括枚举常量)ElementType FIELD
方法声明 ElementType.METHOD
参数声明 ElementType.PARAMETER
构造方法声明 ElementType.CONSTRUCTOR
局部变量声明 ElementType.LOCAL_VARIABLE
注释类型声明 ElementType.ANNOTATION_TYPE
包声明 ElementType.PACKAGE
@Retention表示注释的生命周期,RetentionPolicy取值有:
SOURCE 编译器要丢弃的注释
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,可以反射性地读取
一 定义注解
Useraction注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Useraction {
String userName() default "david";
Hobbys getHobbs() default Hobbys.程序;
String [] getUserAddress() default {"成都高升"};
String sex();
//如注释类只有一个属性:userName,那么就要指明属性:
//LovePer lovePer() default @LovePer(userName="Emma");
//注释类默认属性为:value,可不加属性值,直接输入值就行了
LovePer lovePer() default @LovePer("Emma");
@SuppressWarnings("rawtypes")
Class commanyName();
}
相关类:
public enum Hobbys {
音乐,
电影,
小说,
程序,
游泳
}
public @interface LovePer {
//String userName();
String value();
}
public class Commanys {
public Commanys() {
}
private String name = "志向信息技术开发公司";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class CommanysTwo {
private String name = "志大信息技术开发公司";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CommanysTwo() {
}
}
UseractionTest注解类的测试
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Useraction(commanyName=Commanys.class,userName="陈国强",getHobbs=Hobbys.电影,getUserAddress="重庆大平",sex="男",lovePer=@LovePer("李中"))
public class UseractionTest {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception{
if(UseractionTest.class.isAnnotationPresent(Useraction.class)){
Useraction annotaction = (Useraction)UseractionTest.class.getAnnotation(Useraction.class);
System.out.print("姓名:"+annotaction.userName());
System.out.print(",爱好:"+annotaction.getHobbs());
System.out.print(",地址:"+annotaction.getUserAddress()[0]);
System.out.print(",性别:"+annotaction.sex());
System.out.print(",爱人名字:"+annotaction.lovePer().value());
Class clazz = annotaction.commanyName();
Object obj = clazz.newInstance();
java.lang.reflect.Field field = obj.getClass().getDeclaredField("name");
field.setAccessible(true);
System.out.println(",公司名字:"+field.get(obj));
}
helloAnnotion();
}
@Useraction(commanyName=CommanysTwo.class,userName="陈国轼",getHobbs=Hobbys.小说,getUserAddress="成都双楠",sex="男",lovePer=@LovePer("李静"))
public static void helloAnnotion() throws SecurityException, NoSuchMethodException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException{
Method helloMethod = UseractionTest.class.getMethod("helloAnnotion");
Useraction annotaction = (Useraction)helloMethod.getAnnotation(Useraction.class);
if(null != annotaction){
System.out.print("姓名:"+annotaction.userName());
System.out.print(",爱好:"+annotaction.getHobbs());
System.out.print(",地址:"+annotaction.getUserAddress()[0]);
System.out.print(",性别:"+annotaction.sex());
System.out.print(",爱人名字:"+annotaction.lovePer().value());
@SuppressWarnings("rawtypes")
Class clazz = annotaction.commanyName();
Object obj = clazz.newInstance();
Method method = obj.getClass().getDeclaredMethod("getName");
method.setAccessible(true);
System.out.print(",公司名字:"+method.invoke(obj));
}
}
}
程序控制台输出:
姓名:陈国强,爱好:电影,地址:重庆大平,性别:男,爱人名字:李中,
公司名字:志向信息技术开发公司
姓名:陈国轼,爱好:小说,地址:成都双楠,性别:男,爱人名字:李静,
公司名字:志大信息技术开发公司