java的注解annotation

用处

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)
@Documented
public @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)
@Documented
public @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)
@Documented
public @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: YES
para2: 10000



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值