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