WEB开发网
开发学院软件开发Java 用 annotation 辅助 Json-lib 转换 JavaBean 阅读

用 annotation 辅助 Json-lib 转换 JavaBean

 2010-07-19 00:00:00 来源:WEB开发网   
核心提示: 从清单 2 中可以看出来,Json-lib 通过 PropertyFilter 的 apply 方法进行属性过滤,用 annotation 辅助 Json-lib 转换 JavaBean(4),可以象例子中一样,把所有需要过滤的属性名称写进去,以便适应不同的过滤需求publicabstractb

从清单 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; 
  } 
} 

上一页  1 2 3 4 5 6  下一页

Tags:annotation 辅助 Json

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接