用 annotation 辅助 Json-lib 转换 JavaBean
2010-07-19 00:00:00 来源:WEB开发网从清单 2 中可以看出来,Json-lib 通过 PropertyFilter 的 apply 方法进行属性过滤,可以象例子中一样,把所有需要过滤的属性名称写进去,但是这样做太烦琐,也不好维护,对不同的 Bean 要做不同的处理。下面让我们看看怎么利用 annotation 来更方便的处理。
首先,需要定义一个 annotation,并给 MyBean 的 get 方法加上标注。
清单 3. 定义一个 annotation: Invisible
import java.lang.annotation.Target;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Invisible {
public String[] value();
}
// 为myBean中需要过滤的属性get方法(或者is方法)加上Invisible标注
public class MyBean{
private String name = "json";
private int pojoId = 1;
// getters & setters
public String getName() { return name; }
@Invisible(“LIST”) // 在 “LIST” 情况下不要这个属性
public int getPojoId() { return pojoId; }
}
然后,我们需要一些能处理 annotation 的 PropertyFilter 类。
清单 4. 处理 annotation 的 PropertyFilter 类
import java.util.Map;
import java.lang.reflect.Method;
import net.sf.json.util.PropertyFilter;
// 先实现一个abstract类,将读取Bean属性的Method找到并传递给子类处理
public abstract class AbstractMethodFilter implements PropertyFilter {
// 这个方法留给子类实现,以便适应不同的过滤需求
public abstract boolean apply(final Method method);
public boolean apply(final Object source, final String name, final Object value) {
if (source instanceof Map) {
return false;
}
String propName = name.substring(0, 1).toUpperCase() + name.substring(1);
Class clz = source.getClass();
String methodName = "get" + propName;
Method method = null;
try {
method = clz.getMethod(methodName, (Class[]) null); // 寻找属性的get方法
} catch (NoSuchMethodException nsme) {
String methodName2 = "is" + propName; // 也许是个is方法
try {
method = clz.getMethod(methodName2, (Class[]) null);
} catch (NoSuchMethodException ne) {
// 没有找到属性的get或者is方法,打印错误,返回true
System.err.println(“No such methods: ”
+ methodName + “ or “ + methodName2);
return true;
}
}
return apply(method);
}
} // END: AbstractMethodFilter
public class InvisibleFilter extends AbstractMethodFilter {
// 过滤条件,标注中有符合这个条件的property将被过滤掉
private String _sGUIID;
public InvisibleFilter(final String guiid) {
_sGUIID = guiid;
}
public boolean apply(final Method method) {
if (_sGUIID == null || _sGUIID.equals(“”)) {
return false; // 表示不做限制
}
if (method.isAnnotationPresent(Invisible.class)) {
Invisible anno = method.getAnnotation(Invisible.class);
String[] value = anno.value();
for (int i = 0; i < value.length; i++) {
if (_sGUIID.equals(value[i])) {
return true;
}
}
}
return false;
}
}
Tags:annotation 辅助 Json
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接