这段时间学习了注解与反射的用法,想在这里做个总结。
- 注解的定义
@Target(value = ElementType.FIELD) //可以为ElementType.METHOD .... @Retention(value = RetentionPolicy.RUNTIME) //可以为RetentionPolicy.SOURCE ... public @interface NodeId { }
@Target(value= ElementType.FIELD) @Retention(value = RetentionPolicy.RUNTIME ) public @interface NodeName { }
@Target(value = ElementType.FIELD) @Retention(value = RetentionPolicy.RUNTIME) public @interface NodePid { }
注解定义中最重要的是@Target 和@Retention 属性,在这里我给这两个属性赋值分别为ElementType.FIELD与RentionPolicy.RUNTIME,两者合起来的意思就是:在程序运行中可获得元素类型为变量(域)的值。 - 注解的使用
public class FileBean { @NodeId //将注解加到运行中要取值的对象上 private int id; @NodePid private int pId; @NodeName private String label;
分别将注解标记加在要在运行中获取值的变量上。
- 在运行中使用注解和反射获取变量值
for (T t : datas) { Class aClass = t.getClass(); //通过泛型t得到Class对象 Field[] fields = aClass.getDeclaredFields(); //通过Class对象来的到所有变量的集合 for (Field field : fields) { //遍历变量看变量的注解是否是对应的 if (field.getAnnotation(NodeId.class) != null) { field.setAccessible(true); //反射,将private类型的属性设置可访问 id = field.getInt(t);//反射,拿到属性值 } if (field.getAnnotation(NodePid.class) != null) { field.setAccessible(true); pId = field.getInt(t); } if (field.getAnnotation(NodeName.class) != null) { field.setAccessible(true); label = (String) field.get(t); } } Node node = new Node(id, pId, label); //通过拿到的值新建对象 nodes.add(node); }
当使用泛型时,比如说上面变量t,当还还没有确定实体的时候,我们是无法直接调用方法直接拿到实体中的属性的,同时命名规范又不是太实用的时候,我们便可以利用到注解与反射来得到我们在运行中需要得到的实体对象,这种方法是非常实用的。