`
骞子_Isaac
  • 浏览: 8303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

annotation-注解的实际运用方法

    博客分类:
  • java
 
阅读更多

在以前的工作中,要好多东西虽然不明白怎么回事,但是感觉很方便,很神奇,例如,spring中的@service,@controller,@requestmapping等就特别的方便,下面我就记录一下我对注解的理解以及运用方法。

  • 首先,我们怎么才能吧注解加到我们的类中呢?我们需要先创建注解的类,也就是@interface的类
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface QueryField {
	
	LogicType logicType() default AND;

	Operator operator() default LIKE;

	String fieldName();

	String[] paramName();

	Type type() default STRING;

	boolean ignoreCase() default true;

	MatchType matchType() default ANYWHERE;

	public enum MatchType {
		ANYWHERE(MatchMode.ANYWHERE), EXACT(MatchMode.EXACT), START(
				MatchMode.START), END(MatchMode.END);
		MatchMode matchModel;

		/**
		 * @param matchModel
		 */
		private MatchType(MatchMode matchModel) {
			this.matchModel = matchModel;
		}

		/**
		 * @return the matchModel
		 */
		public MatchMode getMatchModel() {
			return matchModel;
		}
	}
}

 @Retention用来声明注解的保留策略,有CLASSRUNTIMESOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。

这个类里面的属性,就是注解中锁添加的参数。

 

 

  • 然后,我们就要调用这个注解了,因为这个注解的target为field,所以我们要在属性上面去加这个注解
@Scope("prototype")
@QueryEntity(WsJcxxGrlxfsb.class)//基础信息-个人联系方式
public class QueryObjectDemo implements QueryObject,Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -8361090782068743413L;
	@QueryField(fieldName="xnzjhm" ,paramName="xnzjhm",operator=Operator.LIKE,matchType=MatchType.ANYWHERE)
	private String xnzjhm;//校内证件号码
	@QueryField(fieldName="sj",paramName="sj",operator=Operator.EQ )
	private String sj; // 手机
	@QueryField(fieldName="xgsj" ,paramName="xgsjArr",operator=Operator.BETWEEN)
	private Date[] xgsjArr; // 修改时间(记录记录生成或最后一次修改的时间)
	
	private Date xgsj1;
	private Date xgsj2;
	
	@Override
	public void beforeBuildCriteria() {
		xgsjArr = new Date[] {xgsj1,xgsj2};
	}
	
	@Override
	public Criteria afterBuildCriteria(Criteria cr) {
		cr.addOrder(Order.desc("xgsj"));
		return cr;
	}

	/**
	 * @return the xnzjhm
	 */
	public String getXnzjhm() {
		return xnzjhm;
	}

	/**
	 * @param xnzjhm the xnzjhm to set
	 */
	public void setXnzjhm(String xnzjhm) {
		this.xnzjhm = xnzjhm;
	}

	/**
	 * @return the sj
	 */
	public String getSj() {
		return sj;
	}

	/**
	 * @param sj the sj to set
	 */
	public void setSj(String sj) {
		this.sj = sj;
	}

	/**
	 * @return the xgsjArr
	 */
	public Date[] getXgsjArr() {
		return xgsjArr;
	}

	/**
	 * @param xgsjArr the xgsjArr to set
	 */
	public void setXgsjArr(Date[] xgsjArr) {
		this.xgsjArr = xgsjArr;
	}

	/**
	 * @return the xgsj1
	 */
	public Date getXgsj1() {
		return xgsj1;
	}

	/**
	 * @param xgsj1 the xgsj1 to set
	 */
	public void setXgsj1(Date xgsj1) {
		this.xgsj1 = xgsj1;
	}

	/**
	 * @return the xgsj2
	 */
	public Date getXgsj2() {
		return xgsj2;
	}

	/**
	 * @param xgsj2 the xgsj2 to set
	 */
	public void setXgsj2(Date xgsj2) {
		this.xgsj2 = xgsj2;
	}
	
	

}

 

 

 

  • 好了。现在我们都已经把注解都加好了,那么我们加了这些到底有什么用呢,大家接着往下看
public class QueryObjectHelper {
	
	public static <T extends QueryObject> Criteria buildCriteria( T qo,Session session) {
		qo.beforeBuildCriteria();	
		QueryEntity annQo = qo.getClass().getAnnotation(QueryEntity.class);
		Criteria criteria = session.createCriteria(annQo.value());
		Field[] fieldArr = qo.getClass().getDeclaredFields();
		for (Field field : fieldArr) {
			Annotation fieldAnn = field.getAnnotation(QueryField.class);
			field.setAccessible(true);
			try {
				if (fieldAnn == null || fieldAnn.equals("") || field.get(qo) == null || field.get(qo).equals("")) {
					continue;
				}
				Criterion exp = buildExpression(field, qo);
				criteria.add(exp);
			} catch (IllegalArgumentException e1) {
				e1.printStackTrace();
			} catch (IllegalAccessException e1) {
				e1.printStackTrace();
			}
			field.setAccessible(false);
		}
		criteria = qo.afterBuildCriteria(criteria);
		return criteria;
	}

	private static <T extends QueryObject> Criterion buildExpression(
			Field field, T qo) throws IllegalArgumentException,
			IllegalAccessException {
		Param firstParam = null;
		Param secondParam = null;
		Param likeParam = null;
		QueryField ann = field.getAnnotation(QueryField.class);
		switch (ann.operator()) {
		case BETWEEN:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					((Object[]) field.get(qo))[0], ann.type());
			secondParam = Param.getCommonParam(ann.paramName()[1],
					((Object[]) field.get(qo))[1], ann.type());
			return Between.between(ann.logicType(), ann.fieldName(),
					firstParam, secondParam);
		case NOT_BETWEEN:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					((Object[]) field.get(qo))[0], ann.type());
			secondParam = Param.getCommonParam(ann.paramName()[1],
					((Object[]) field.get(qo))[1], ann.type());
			return Between.notBetween(ann.logicType(), ann.fieldName(),
					firstParam, secondParam);
		case EQ:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.eq(ann.logicType(), ann.fieldName(), firstParam);
		case NE:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.ne(ann.logicType(), ann.fieldName(), firstParam);
		case LT:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.lt(ann.logicType(), ann.fieldName(), firstParam);
		case LE:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.le(ann.logicType(), ann.fieldName(), firstParam);
		case GT:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.gt(ann.logicType(), ann.fieldName(), firstParam);
		case GE:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return Compare.ge(ann.logicType(), ann.fieldName(), firstParam);
		case LIKE:
			likeParam = Param.getVarcharParam(ann.paramName()[0],
					field.get(qo), ann.ignoreCase(), ann.matchType()
							.getMatchModel());
			return Like.like(ann.logicType(), ann.fieldName(), likeParam);
		case NOT_LIKE:
			likeParam = Param.getVarcharParam(ann.paramName()[0],
					field.get(qo), ann.ignoreCase(), ann.matchType()
							.getMatchModel());
			return Like.notLike(ann.logicType(), ann.fieldName(), likeParam);
		case IN:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return In.in(ann.logicType(), ann.fieldName(), firstParam);
		case NOT_IN:
			firstParam = Param.getCommonParam(ann.paramName()[0],
					field.get(qo), ann.type());
			return In.notIn(ann.logicType(), ann.fieldName(), firstParam);
		case IS_NULL:
			return JudgeNull.isNull(ann.logicType(), ann.fieldName());
		case IS_NOT_NULL:
			return JudgeNull.isNotNull(ann.logicType(), ann.fieldName());
		default:
			break;
		}
		return null;
	}
}

 

我们可以看到,我们是通过我们的注解,以及注解中的参数,把我们需要的数据拿了过来重新组装成我们需要的东西,这样看来,很多相似的东西我们就可以这样做,从实现的原理上我们参考的是封装,而从根本实现是基于java的反射机制,通过反射,以及我们对规则的掌握,我们就可以通过注解的方式去实现很多重复的方法,其中不同的东西,我们也是靠参数传到注解里面了,这样我们的代码看着就很整洁,而且会减少我们没有必要的冗余代码,从实现与框架上都是一个不错的选择,我们可以通过这个写一套自己的SPRING框架!就是这么简单!

分享到:
评论

相关推荐

    annotation-file-utilities.jar.zip

    在实际使用中,`annotation-file-utilities.jar`可能需要与其他构建工具(如Maven或Gradle)配合,通过指定依赖关系将其引入项目。开发者可以利用这个库提供的功能,编写更加高效和可维护的代码,同时减少手动配置和...

    黑马程序员---注解归纳

    同时,配合提供的`annotation.txt`文件,你可能能获取到更多关于注解的实际案例和示例代码,进一步巩固理论知识。 总的来说,注解是Java编程中不可或缺的一部分,熟练掌握注解的使用不仅能提高代码的可读性和可维护...

    Android Annotation 安卓注解实例

    通过这个"Android Annotation 实例"的压缩包,你可以深入学习如何在实际项目中运用这些注解,理解它们的工作原理,以及如何通过注解优化代码结构和提高开发效率。实践中,不断尝试并结合个人项目需求,你将更好地...

    Annotations 所需jar包.rar

    在Java开发中,SSH(Struts2、Spring、Hibernate)框架是常见的企业级应用开发框架,它极大地简化了Web应用程序的构建过程。...在实际项目中,熟练运用这些注解能够提升开发效率,同时保持代码的整洁和可维护性。

    hibernate-annotation

    《深入理解Hibernate注解》 Hibernate作为Java领域中的一款强大持久化框架,极大地简化了数据库操作。而Hibernate注解则是其在ORM...通过熟练掌握并合理运用这些注解,开发者可以更好地驾驭数据库操作,提高开发效率。

    annotation-springMVC.rar_springmvc_springmvc API chm

    《SpringMVC注解详解与应用...理解并熟练运用这些注解,能让你在SpringMVC开发中游刃有余,提高开发效率和代码质量。通过阅读"springMVC详解以及注解说明.doc",你可以获得更深入的理解和实例,进一步提升自己的技能。

    Android-注解与反射注解知识点反射知识点注解java反射

    在Android开发中,注解(Annotation)和反射(Reflection)是两个重要的概念,它们极大地提升了代码的可维护性、灵活性和动态性。本篇将详细阐述这两个知识点,并结合实际示例进行讲解。 **注解(Annotation)** 1...

    自定义注解annotation及用法

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...

    反射-动态代理-注解

    **注解(Annotation)** 注解是一种元数据,为代码提供了一种声明式的方式来添加信息。这些信息可以在编译时或运行时被工具或JVM读取。注解不是代码的一部分,但可以影响代码的行为。 1. **定义注解**:使用`@...

    Spring annotation

    Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了...理解并熟练运用这些注解是每个Spring开发者必备的技能。在实际开发中,根据项目需求选择合适的注解,可以有效地组织和管理代码,提升开发效率。

    spring-security-helloworld-annotation

    《Spring Security HelloWorld 注解详解》 在Java Web开发领域,Spring Security是一个强大的安全框架,它提供了全面的安全管理解决方案...在实际开发中,我们应根据项目需求灵活运用这些注解,以实现复杂的安全策略。

    详解Android注解 Annotation

    在Android开发中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或者运行时环境用来执行特定的操作。注解在Java语言中引入,随后被广泛应用于Android系统,帮助开发者实现...

    JAVA Annotation学习

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些...学习这些材料,将有助于你全面掌握Java注解的使用,并能够在实际项目中灵活运用。

    详解JDK 5 Annotation 注解之@Target的用法介绍

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了一种安全的方法来关联信息于程序元素,如类、方法、变量等,而这些信息可以...在实际开发中,理解并熟练运用 `@Target` 是使用Java注解不可或缺的一部分。

    java-reflection-annotation-test:探索java反射和注解之美

    在实际应用中,注解通常与处理器(Annotation Processor)一起使用。处理器会在编译期间读取注解并执行相应的操作,例如生成源代码、验证代码或执行配置。`javax.annotation.processing.Processor`接口是实现处理器...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    在实际项目中,合理运用这些注解可以有效地降低组件间的耦合度,实现松耦合的设计。 在深入研究`@Autowired`和`@Qualifier`的同时,我们还需要关注Spring的源码,理解其内部的工作原理。通过阅读源码,我们可以了解...

    Java Annotation注解

    在Java编程语言中,Annotation(注解)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必影响代码的运行时行为。...在实际开发中,合理运用注解可以极大地提高开发效率和代码质量。

    (转)Java中的注解是如何工作的?

    Java中的注解(Annotation)是元数据的一种形式,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、构建工具或者运行时环境...在实际项目中,恰当地运用注解可以简化配置、优化代码结构,并让开发流程更加高效。

    java注解annotation.rar

    Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。...在实际开发中,理解并熟练运用注解对于提升代码质量和开发效率具有重要意义。

    反射,注解原理和使用的方法

    在Java编程语言中,反射和注解是两个非常重要的特性,它们极大地增强了代码...在实际项目中,合理运用这两个特性,可以降低代码的耦合度,提高代码的可维护性和可读性。在学习过程中,务必动手实践,通过实例加深理解。

Global site tag (gtag.js) - Google Analytics