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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值