注解与反射

这段时间学习了注解与反射的用法,想在这里做个总结。

  •  注解的定义  
    @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,当还还没有确定实体的时候,我们是无法直接调用方法直接拿到实体中的属性的,同时命名规范又不是太实用的时候,我们便可以利用到注解与反射来得到我们在运行中需要得到的实体对象,这种方法是非常实用的。

         

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值