Java 之注解浅谈

package com.enhance.Annotaion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.enhance.enumeration.TrafficLamp;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
	
	//如果这个注解只有一个value属性,那么在使用注解的时候前面的value=可以省略
	String value();
	
	//如果这个注解有 默认的值,那么在使用注解的时候可以不用赋值.否则 必须赋值
	String color() default "blue"; 
	
	int[] arrayAttr() default {3,4,4};
	
	TrafficLamp lamp() default TrafficLamp.RED;
	
	MetaAnnotaion annotationAtrr() default @MetaAnnotaion("hibernate");
	
	Class classAttr() default MyAnnotation.class;
}


原注解
package com.enhance.Annotaion;

public @interface MetaAnnotaion {
	String value();
}


package com.enhance.Annotaion;

import java.util.Arrays;

import com.enhance.enumeration.TrafficLamp;

@MyAnnotation(annotationAtrr=@MetaAnnotaion("Spring"),color="yellow",value="abc",arrayAttr=4,lamp=TrafficLamp.YELLOW)  //如果数组属性的值只有一个,可以省略 {}
//@MyAnnotation(color="yellow",value="abc",arrayAttr={1,2,3})  //一点加入了标注,就表示创建了这个类的对象
public class AnnotationTest {
	
	@MyAnnotation("money")  //这里是给 value属性赋值
	public static void main(String[] args){
		//对应用注解的类,使用反射进行操作
		if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
			//如果这个类中存在这个注解 就进行 相应的操作
			MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
			System.out.println(annotation.color());  //yellow
			System.out.println(annotation.value());  //abc
			System.out.println(Arrays.toString(annotation.arrayAttr()));  //给数组复制
			System.out.println(annotation.lamp().nextLamp().name());
			System.out.println(annotation.annotationAtrr().value());
		}
	}
}



//说明
十、	注解
a)	@ SuppressWarnings(“deprecation”):禁止显示警告
b)	@Deprecated:让某个方法过时
c)	@Override:重写的时候最好加上
d)	注解标记可以加在 包,类,字段,方法,方法的参数,局部变量上.
e)	注解的应用
i.	定义注解类 	public @interface MyAnnotation
ii.	应用注解类 @MyAnnotation
iii.	对应用注解类的类进行反射操作的类
f)	@Retention(RetentionPolicy.RUNTIME):定义注解类的生命周期Source,Class,Runtime
g)	@Target({ElementType.METHOD,ElementType.TYPE}):标记我们的注解可以应用的在那些成员上(Type: class)
h)	给自定义注解加如属性
i.	可以省略名称的 value()
ii.	定义简单类型属性  String ;如果 可选设置的话,必须加上 缺省default 值
iii.	定义 数组属性   int[] arrayAttr;如果只有一个值的时候,可以省略{}
iv.	定义 枚举类型的数组  TrafficLamp [] lamp() default TrafficLamp.RED;
v.	定义 注解类型的的属性
vi.	定义 Class 类型


你可能感兴趣的:(annotation,@Retention,@Target)