专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 软件架构设计

java诠注

发布时间:2011-06-20 02:07:39 文章来源:www.iduyao.cn 采编人员:星星草
java注解
自JDK1.5之后引入注解之后,各个框架中都提供了支持注解的方式。在日常开发中慢慢的将XML许多的配置转换成注解,经常的使用

甚至陶sir在定义日终类的时候,自定义了注解:@Trigger 和 @TargetMethod 以作使用。可见注解的易用性和广泛性。

这边对注解做一些了解

元注解:在jdk中提供了 为自定义注解 所需要的几个元注解:

    @interface : 用于定义注解
    @Target :用于描述注解的使用范围  大致有 method(方法) field(属性) type (类)
    @Retention : 注解的生命周期 SOURCE :源文件有效,CLASS :class文件有效, RUNTIME : 运行时有效
    @Documented : javadoc记录标记

然后对应注解 自定义 method field type 三类注解
/**
 * 自定义注解,目标范围是字段
 * 
 * @author yanbin
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AnnotationField {

	public String fieldValue() default "default Field value";

}

/**
 * 自定义注解,目标范围是方法
 * 
 * @author yanbin
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationMethod {

	public String methodValue() default "default Method value"; 
	
}

/**
 * 自定义注解,目标是类
 * 
 * @author yanbin
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AnnotationType {

	public String typeValue() default "default Type value";

}


在一个类上面使用自定义的注解:

/**
 * 注解使用者
 * 
 * @author yanbin
 * 
 */
@AnnotationType(typeValue = "user Type value")
public class AnnotationUser {

	/** 字段属性 */
	@AnnotationField(fieldValue = "user Field value")
	private String userField;

	/**
	 * 使用者方法
	 */
	@AnnotationMethod(methodValue = "user method value")
	public String userMethod() {
		return "user default method value";
	}

	/**
	 * 做事
	 */
	public void doIt() {
		System.out.println(userField);
	}

	public String getUserField() {
		return userField;
	}

	public void setUserField(String userField) {
		this.userField = userField;
	}

}


测试类,解析注解:
/**
 * 注解测试类,获取注解关键在反射
 * 
 * @author yanbin
 * 
 */
public class AnnotationTest {

	public static void main(String[] args) {
		AnnotationTest test = new AnnotationTest();
		test.resolve();
		test.testDoIt();
	}

	/**
	 * 解析如何获取注解对应注解中的值
	 */

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void resolve() {
		try {
			// 后去对应的类
			Class clazz = Class.forName("annotation.user.AnnotationUser");
			// 判断clazz是否存在FirstAnno.class注解
			if (clazz.isAnnotationPresent(AnnotationType.class)) {
				// 存在,则获取这个注解
				AnnotationType annoType = (AnnotationType) clazz.getAnnotation(AnnotationType.class);
				System.out.println("AnnotationType value: " + annoType.typeValue());
			}

			// 获取该类的所有方法
			Method[] methods = clazz.getDeclaredMethods();
			// 解析方法注解
			for (Method method : methods) {
				if (method.isAnnotationPresent(AnnotationMethod.class)) {
					AnnotationMethod annoMethod = method.getAnnotation(AnnotationMethod.class);
					System.out.println("AnnotationMethod value: " + annoMethod.methodValue());
				}
			}

			// 获取该类的所有属性字段
			Field[] fields = clazz.getDeclaredFields();
			// 解析字段注解
			for (Field field : fields) {
				if (field.isAnnotationPresent(AnnotationField.class)) {
					AnnotationField annoField = field.getAnnotation(AnnotationField.class);
					System.out.println("AnnotationField value: " + annoField.fieldValue());
				}
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解释注解中的值,并且赋值给相关属性或者方法
	 */
	public void testDoIt() {
		try {
			AnnotationUser user = new AnnotationUser();
			Field field = user.getClass().getDeclaredField("userField");
			if (field.isAnnotationPresent(AnnotationField.class)) {
				AnnotationField annoField = field.getAnnotation(AnnotationField.class);

				// getDeclaredMethod()返回一个 Method 对象,该对象反映此 Class
				// 对象所表示的类或接口的指定已声明方法。name 参数是一个
				// String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组
				// Method doIt = user.getClass().getDeclaredMethod("doIt");

				// 属性必须要由set 或者get 方法,才能调用invoke方法
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), AnnotationUser.class);
				Method doIt = pd.getWriteMethod();

				if (null != doIt) {
					String value = annoField.fieldValue();
					doIt.invoke(user, value);
				}
			}
			user.doIt();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: