`
niuka
  • 浏览: 51667 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义注解使用

阅读更多

   自从jdk1.5支持注解之后,越来越多的框架,都开始支持了注解的配置方式了,一开始看到注解觉得蛮神奇的,后来把他的原理弄明白之后,觉得也就那么回事了,跟xml配置没多大的区别了。

  呵呵,先说说我最近遇到的问题吧,最近我们项目用到了hibernate的Criteria来查询数据,当我们使用模糊查询的时候虽然可以直接用criteria.enableLike()就可以启用模糊查询了,但是hibernate不会自动帮你属性加上%

 所以就跟普通的查询差不多。为了解决这个问题,我们使用了java的反射机制,但是我们想不光是给String类型属性前后加上%,还想就是可以通过配置实现是前模糊还是后模糊,或者是有些个属性我还是不想使用模糊查询,所以我使用了注解来实现这个配置。

步骤1: 先定义一个注解类

package arron;

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


/**
 * 设置模糊查询的注解类
 * @author a2j9xzz
 *
 */
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FuzzyInquiry {
	/**
	 * 默认为属性前后模糊查询
	 * @return
	 */
	FuzzyType fuzzyType() default FuzzyType.All;

}

 步骤2:然后定义一个枚举类型。不用说大家都能猜出是拿来干什么用的。

package arron;

/**
 * 模糊查询类型枚举
 * @author a2j9xzz
 *
 */

public enum FuzzyType {
	/**
	 * 为整个属性加上模糊查询
	 * %propertity%
	 * 
	 */
    All,
    LEFT,
    RIGHT,
    NONE,

}

步骤3: 给我们的实体类配上注解。

package arron;


/**
 * 测试的实体类
 * @author a2j9xzz
 *
 */
public class AClass {

	public String a;
	public String b;
	public String c;
	public String d;
	
	
	@FuzzyInquiry(fuzzyType=FuzzyType.All)
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	/**
	 * 通过注解配置实现这个属性前加上百分号
	 * @return
	 */
	@FuzzyInquiry(fuzzyType=FuzzyType.LEFT)
	public String getB() {
		return b;
	}
	public void setB(String b) {
		this.b = b;
	}
	/**
	 * 通过注解配置实现这个属性后加上百分号
	 * @return
	 */
	@FuzzyInquiry(fuzzyType=FuzzyType.RIGHT)
	public String getC() {
		return c;
	}
	public void setC(String c) {
		this.c = c;
	}
	/**
	 * 通过注解配置实现这个属性不加上百分号
	 * @return
	 */
	@FuzzyInquiry(fuzzyType=FuzzyType.NONE)
	public String getD() {
		return d;
	}
	public void setD(String d) {
		this.d = d;
	}
	
	
}

 步骤4:光有注解其实是没用的,就好像你只写了个xml文件一样,注解本身是不能干活的,必须要一个处理器才能起作用,不过以下代码写的有点烂,有时间我会改进一下的。

package arron;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;


public class AnnotationTest {

	
	public void testConvertObject(Object obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException{
		Field []  fields = obj.getClass().getDeclaredFields();
		Method [] methods = obj.getClass().getDeclaredMethods();
		for(Field field : fields){
			String value = "";
			for(Method method :methods ){
				if(field.getName().equalsIgnoreCase(method.getName().substring(3))){

					if(field.getGenericType().toString().equals("class java.lang.String")){
						if(method.getName().startsWith("get")){
							value = (String) method.invoke(obj, null);
							if(value!=null){
								FuzzyInquiry fuzzyInquiry = method.getAnnotation(FuzzyInquiry.class);
								if(fuzzyInquiry!=null){
									if(fuzzyInquiry.fuzzyType()==FuzzyType.All){
										value = "%"+value.trim()+"%";
									}else if(fuzzyInquiry.fuzzyType() ==FuzzyType.LEFT){
										value ="%"+value.trim();
									}else if(fuzzyInquiry.fuzzyType() ==FuzzyType.RIGHT){
										value=value.trim()+"%";
									}else{
										value=value.trim();
									}
								}
							}
							//获得set方法
							String setMothodName = "set";
							String getMehodName = method.getName();
							setMothodName =getMehodName.replace("get", "set");
							Method setMehod = obj.getClass().getDeclaredMethod(setMothodName, String.class);
							setMehod.invoke(obj, value);
						}
					}
				}
			}
		}
	}
	
	/**
	 * 
	 */
	@Test
	public void testMethod(){
		AClass net = new AClass();
		net.setA("arron ");
		net.setB("aaa");
		net.setC("sdfsdfsdf");
		net.setD("Niujun Zhang");
		try {
			testConvertObject(net);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(net.getA()+" "+net.getB()+" "+net.getC()+" "+net.getD());
	}
}

 呵呵 大体上功能算是完成了呵呵。

结果输出:

%arron% %aaa sdfsdfsdf% Niujun Zhang

ok finish!呵呵。

分享到:
评论

相关推荐

    Java自定义注解使用反射获取字段注解

    接下来,我们可以创建一个类并使用自定义注解标记某个字段: ```java public class AnnotationDemo { @MyCustomAnnotation("测试注解") private String testField; } ``` 现在,我们可以使用反射机制来获取这个...

    java 自定义注解例子

    自定义注解的定义类似于接口,但使用`@interface`关键字。例如,我们可以定义一个`@SoldOut`注解,表示某种商品售罄: ```java import java.lang.annotation.Retention; import java.lang.annotation....

    java 自定义注解验证

    `src`目录则是源代码存放的地方,其中可能包含自定义注解的定义以及使用这些注解的代码。 总之,Java自定义注解验证是增强代码规范性和健壮性的有效手段,通过自定义注解可以实现更精细的代码管理和验证。本案例中...

    自定义注解实现伪动态传参的小demo

    在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...

    java自定义注解实践

    例如,我们可以使用自定义注解来描述方法的参数信息,以便在运行时获取这些信息。 ```java @Sample(value="I'm here.") public void anyName() { // ... } ``` 在上面的例子中,我们使用了 `Sample` 注解来描述 `...

    实现生成自定义注解的实体类

    在Java编程语言中,自定义注解是一种强大的...通过定义、使用、处理和集成自定义注解,我们可以构建更灵活、更强大的应用程序。在实际项目中,合理利用自定义注解能够显著提升开发效率,减少代码冗余,增强框架扩展性。

    excel导入动态校验,自定义注解动态校验

    自定义注解动态校验则是在编程环境中,通过使用自定义注解来定义数据验证规则。注解是一种元数据,可以提供有关代码的附加信息,通常用于简化代码并提高可读性。在导入Excel数据时,开发者可以创建自定义注解,这些...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    要创建自定义注解,我们需要使用`@interface`关键字。例如,我们可以定义一个名为`MyComponent`的注解: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java....

    Java中的注解及自定义注解使用详解.docx

    在使用自定义注解时,可以使用反射API来读取和处理这些注解。例如,`java.lang.reflect.AnnotatedElement`接口提供了访问注解的方法。 在实际开发中,注解广泛应用于依赖注入、持久化框架、测试框架等领域。例如,...

    自定义注解实现拦截sql.rar

    在Java开发中,自定义注解是一种非常强大的工具,它允许我们为代码添加元数据,以便在运行时或编译时进行处理。本示例中,“自定义注解实现拦截SQL”是关于如何通过注解来动态修改执行的SQL语句,以在其中增加特定的...

    Spring 自定义注解的解析

    接下来,我们将讨论如何在Spring中使用`@ComponentScan`注解来扫描并处理自定义注解。`@ComponentScan`是Spring的核心组件扫描机制,它会遍历指定包及其子包下的所有类,寻找标记了Spring的组件注解(如`@Component`...

    SpringBoot AOP各种注解、自定义注解、鉴权使用案例(免费下载)

    例如,创建一个名为`@Cacheable`的自定义注解,用于缓存方法的返回结果: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Cacheable { String cacheName() default ...

    Java自定义注解实例

    3. **使用**: 在代码中,可以将自定义注解应用于目标元素,如: ```java public class MyClass { @MyAnnotation(value = "Hello, World!") public void myMethod() { // ... } } ``` ### 三、注解处理器 ...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    java(spring boot)自定义注解

    2. 使用注解:在需要监控的方法上使用自定义注解,指定相关指标。 ```java @Service public class MyService { @MyMonitor(metricName = "myServiceCall", importance = 5) public void performTask() { // 方法...

    spring自定义注解样例

    本示例主要探讨如何在Spring中创建和使用自定义注解,以及与AOP结合实现动态代理。 首先,我们需要了解自定义注解的基本结构。在Java中,自定义注解是以`@interface`关键字定义的。例如,我们可以创建一个名为`...

    Java自定义注解与spring BeanPostProcessor详解

    使用自定义注解后,我们需要编写处理这些注解的逻辑,这通常是通过注解处理器或者在运行时通过反射实现的。 接下来,我们讨论Spring的BeanPostProcessor。BeanPostProcessor是Spring框架的核心组件之一,它提供了一...

Global site tag (gtag.js) - Google Analytics