首页 > 学院 > 开发设计 > 正文

java的注解annotation

2019-11-14 10:44:41
字体:
来源:转载
供稿:网友

用处

1:生成文档

常用的有@see @param @return 等:2:跟踪代码依赖性,实现替代配置文件功能。比较常见的是sPRing 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。以后java的程序开发,最多的也将实现注解配置,具有很大用处;3:”在编译时进行格式检查。

如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

api:

1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null:

2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。3:boolean isAnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.:

4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

demo1:

/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果颜色注解 *  * @author peida */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {	/**	 * 颜色枚举	 */	public enum Color {		BULE, RED, GREEN	};	/**	 * 颜色属性	 * 	 * @return	 */	Color fruitColor() default Color.GREEN;}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果名称注解 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {	String value() default "";}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 水果供应者注解 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitProvider {	/**	 * 供应商编号	 * 	 * @return	 */	public int id() default -1;	/**	 * 供应商名称	 * 	 * @return	 */	public String name() default "";	/**	 * 供应商地址	 * 	 * @return	 */	public String address() default "";}/******************************************************************************* ******************************************************************************/package test.annotation.field;import test.annotation.field.FruitColor.Color;public class Apple {	@FruitName("Apple")	private String appleName;	@FruitColor(fruitColor = Color.RED)	private String appleColor;	@FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路89号红富士大厦")	private String appleProvider;}/******************************************************************************* ******************************************************************************/package test.annotation.field;import java.lang.reflect.Field;public class AnnotationFiledTest {	/**	 * @param args	 */	public static void main(final String[] args) {		getFruitInfo(Apple.class);	}	public static void getFruitInfo(final Class<?> clazz) {		String strFruitName = " 水果名称:";		String strFruitColor = " 水果颜色:";		String strFruitProvicer = "供应商信息:";		final Field[] fields = clazz.getDeclaredFields();		for (final Field field : fields) {			if (field.isAnnotationPresent(FruitName.class)) {				final FruitName fruitName = field.getAnnotation(FruitName.class);				strFruitName = strFruitName + fruitName.value();				System.out.println(strFruitName);			} else if (field.isAnnotationPresent(FruitColor.class)) {				final FruitColor fruitColor = field.getAnnotation(FruitColor.class);				strFruitColor = strFruitColor + fruitColor.fruitColor().toString();				System.out.println(strFruitColor);			} else if (field.isAnnotationPresent(FruitProvider.class)) {				final FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);				strFruitProvicer = strFruitProvicer + fruitProvider.id() + ";" + fruitProvider.name() + ";" + fruitProvider.address();				System.out.println(strFruitProvicer);			}		}	}} 水果名称:Apple 水果颜色:RED供应商信息:1;陕西红富士集团;陕西省西安市延安路89号红富士大厦

demo2:

/******************************************************************************* ******************************************************************************/package test.annotation.method;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 定义一个注解 */@Target(ElementType.METHOD)// 这是一个对方法的注解,还可以是包、类、变量等很多东西@Retention(RetentionPolicy.RUNTIME)// 保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型@Documented// 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化public @interface OneAnnotation {	// 定义注解的参数,类型可以为基本类型以及String、Class、enum、数组等,default为默认值	String parameter1() default "";	int parameter2() default -1;}/******************************************************************************* ******************************************************************************/package test.annotation.method;/** * 一个用到了自定义的注解的类 */public class OneClass {	@OneAnnotation(parameter1 = "YES", parameter2 = 10000)	public void oneMethod() {	}}/******************************************************************************* ******************************************************************************/package test.annotation.method;import java.lang.reflect.Method;public class AnnotationMethodTest {	public static void main(final String[] args) throws Exception {		// 提取到被注解的方法Method,这里用到了反射的知识		final Method method = Class.forName("test.annotation.method.OneClass").getDeclaredMethod("oneMethod");		// 从Method方法中通过方法getAnnotation获得我们设置的注解		final OneAnnotation oneAnnotation = method.getAnnotation(OneAnnotation.class);		// 得到注解的俩参数		System.out.println("para1: " + oneAnnotation.parameter1());		System.out.println("para2: " + oneAnnotation.parameter2());	}}para1: YESpara2: 10000


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表