Java之注解

注解:也指元数据,在代码中添加信息提供的一种形式化方法
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));
		}		
	}
}


程序控制台输出:
姓名:陈国强,爱好:电影,地址:重庆大平,性别:男,爱人名字:李中,
公司名字:志向信息技术开发公司
姓名:陈国轼,爱好:小说,地址:成都双楠,性别:男,爱人名字:李静,
公司名字:志大信息技术开发公司

你可能感兴趣的:(java,音乐)