«

学习笔记-注解+反射读取Bean中数据

时间:2024-3-2 19:18     作者:韩俊     分类: Android


我们经常有从数据源(即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>

标签: android

热门推荐