自从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!呵呵。