首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

自定义诠注使用

2012-10-29 
自定义注解使用???自从jdk1.5支持注解之后,越来越多的框架,都开始支持了注解的配置方式了,一开始看到注解

自定义注解使用

???自从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);}}}}}}/** *  */@Testpublic 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 blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(net.getA()+" "+net.getB()+" "+net.getC()+" "+net.getD());}}

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

结果输出:

%arron% %aaa sdfsdfsdf% Niujun Zhang

ok finish!呵呵。

热点排行