我们经常有从数据源(即javabean中拿数据)的需要,但不同的人对bean中内容的命名五花八门,但利用注解+反射可以写出通用的提取数据的代码。
假设需求是:从一个bean中取出NodeId, NodePId, NodeName三个成员。
假如一个bean是这样写的:getset方法省略
public class FileBean { private int id; private int pId; private String label;}
还有一个是这样:
public class OrgBean { private int _id; private int parentId; private String name; }
它们的命名方式有所区别。
下面建立三个注解,对应三个成员:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface NodeId { }
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface NodePId { }
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface NodeName { }在上面的bean中添上对应的注解:
public class OrgBean { @NodeId private int _id; @NodePId private int parentId; @NodeLabel private String name; }
写一个方法获取数据:
public static <T> List<Node> convertDataToNode(List<T> data) throws IllegalAccessException, IllegalArgumentException { //将数据都存入Node中 List<Node> nodes = new ArrayList<Node>(); Node node = null; for (T t : data) { Class clazz = t.getClass(); //获取bean的class int id = -1; int pId = -1; String label = ""; //拿到类中所有Field Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //通过注解拿到相应成员 field.setAccessible(true); //成员是私有的,设置强制获取 if(field.getAnnotation(NodeId.class)!=null) { id = field.getInt(t); } if(field.getAnnotation(NodePId.class)!=null) { pId = field.getInt(t); } if(field.getAnnotation(NodeLabel.class)!=null) { label = (String) field.get(t); } } //将数据存入node node = new Node(id, pId, label); nodes.add(node); }
这样一来,无论javabean中的成员怎么命名,都可以顺利地将数据转入node中了。
<p>版权声明:本文为博主原创文章,未经博主允许不得转载。</p>