【面试加分项】java自定义注解之解析注解
2015-07-26 11:57
246 查看
我之前的博客中说明过自定义注解的声明今天我们来看看如何对我们自己定义的注解进行使用。
这个注解只有一个参数,所以我们在使用时不需要显示说明参数名称。下面我们写一个类并使用注解。
大家可以看到我们写了一个类,并在他的上面写了一个我们的注解,假设我们现在要实现的功能是把注解中的值赋值给下面的属性name,那我们该怎么做呢。在这里我们可以看到我们在构造方法中调用了Inject.injectfeild(this),这个方法就是我们对注解进行解析,接下来我们就来看看具体是如何做的。
其实我们就是通过反射获取了注解的值和对应的字段,在对他进行赋值。下面我们再来看看测试:
结果:
liu
当然通常情况下一个普通的类的字段赋值我们可以直接给他一个set函数,这个例子只是然大家理解如何进行自定义注解。但是在许多框架中他们的属性都是这样进行赋值,原因是为了解耦,有兴趣的可以学习一下ioc的相关知识。
由于上传到csdn的源码审核还没过,需要源码的可以在评论中留邮箱,我会尽快发过去。
1.我们在程序中使用我们的注解。
上一篇中我们自定义了一个注解:@Target(ElementType.FIELD)//注解的作用范围,就是注解是用在什么地方的 @Retention(RetentionPolicy.RUNTIME)//注解的级别,就是注解能留存到什么时候 @Documented @Inherited public @interface MyAnnotation { public String value();//注解可以接收的参数 }
这个注解只有一个参数,所以我们在使用时不需要显示说明参数名称。下面我们写一个类并使用注解。
public class People { @MyAnnotation("liu") private String name; public People() { Inject.injectfeild(this); } public String getName(){ return name; } }
大家可以看到我们写了一个类,并在他的上面写了一个我们的注解,假设我们现在要实现的功能是把注解中的值赋值给下面的属性name,那我们该怎么做呢。在这里我们可以看到我们在构造方法中调用了Inject.injectfeild(this),这个方法就是我们对注解进行解析,接下来我们就来看看具体是如何做的。
2.对注解进行解析
废话不多说先上代码:public class Inject { public static void injectfeild(Object o){ Class<?> clazz = o.getClass(); //获得传进来的类 Field[] fields = clazz.getDeclaredFields();//通过反射获取类的域(全局变量) for (Field field : fields) { // 查看这个字段是否有我们自定义的注解类标志的 if (field.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation inject = field.getAnnotation(MyAnnotation.class); //获取到我们的注解 String value=inject.value();//获取注解的参数 field.setAccessible(true); try { field.set(o, value);//为我们的字段赋值 } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } } } }
其实我们就是通过反射获取了注解的值和对应的字段,在对他进行赋值。下面我们再来看看测试:
public class Test { public static void main(String[] args) { People people=new People(); System.out.println(people.getName()); } }
结果:
liu
当然通常情况下一个普通的类的字段赋值我们可以直接给他一个set函数,这个例子只是然大家理解如何进行自定义注解。但是在许多框架中他们的属性都是这样进行赋值,原因是为了解耦,有兴趣的可以学习一下ioc的相关知识。
由于上传到csdn的源码审核还没过,需要源码的可以在评论中留邮箱,我会尽快发过去。
相关文章推荐
- (剑指Offer)面试题36:数组中的逆序对
- 几个面试好地址
- 黑马程序员——Java基础-IO流
- 求子数组的最大和
- 【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
- 【LeetCode-面试算法经典-Java实现】【032-Longest Valid Parentheses(最长有效括号)】
- 【LeetCode-面试算法经典-Java实现】【030-Substring with Concatenation of All Words(串联所有单词的子串)】
- 【Web探索之旅】第四部分:Web程序员
- 【头条网给你一个机会做代言人】征文大赛三等奖:程序员联盟
- 程序员如何保持健康
- 黑马程序员-ios学习笔记 oc 类和对象
- 【程序员创业】商业计划书怎么写才能与众不同?
- 【程序员创业】商业计划书怎么写才能与众不同?
- 【程序员创业】商业计划书怎么写才能与众不同?
- 致一码农兄弟的一封信
- Java面试题汇总
- PHP程序员技能栈
- 静下心准备保研复试和工作的面试
- Java程序员到架构师的推荐阅读书籍
- 面试题目思路及设计