关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是

总结了两种方式,记录如下:

第一种:结合反射进行属性注入,代码如下:

1、定义一个注解:

package com.xxx.ann.simple;

import java.lang.annotation.*;
/**
* 1.注解的定义:Java文件叫做Annotation,用@interface表示。
*
* 2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。
*
* 3.注解的保留策略:
*
*   @Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含
*
*   @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
*
*   @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
*
* 4.注解的作用目标:
*
*   @Target(ElementType.TYPE) // 接口、类、枚举、注解
*
*   @Target(ElementType.FIELD) // 字段、枚举的常量
*
*   @Target(ElementType.METHOD) // 方法
*
*   @Target(ElementType.PARAMETER) // 方法参数
*
*   @Target(ElementType.CONSTRUCTOR) // 构造函数
*
*   @Target(ElementType.LOCAL_VARIABLE) // 局部变量
*
*   @Target(ElementType.ANNOTATION_TYPE) // 注解
*
*   @Target(ElementType.PACKAGE) // 包
*
* 5.注解包含在javadoc中:
*
*   @Documented
*
* 6.注解可以被继承:
*
*   @Inherited
*
* 7.注解解析器:用来解析自定义注解。
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnno {
//注解的属性
String name() default "rose"; String value() default "jack";
}

2、用于属性:

/**
* 一个属性中使用了自定义注解的对象
*/
public class Person {
@MyAnno(name="tom")
private String name; private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

3、测试类与注解值得获取:

/**
* 测试类
* @param <T>
*/
public class TestClass<T> {
/**
* 主方法
* @param args
*/
public static void main(String[] args) {
Person person = getPerson(Person.class); System.out.println(person.getName());
} /**
* 通过反射获取注解的值
* @param clz
* @return
*/
public static Person getPerson(Class clz){
Person person =null;
try {
person = (Person)clz.newInstance();
//获取属性
Field[] fields = clz.getDeclaredFields();
for(Field field : fields){
//是否被特定注解修饰
boolean fieldHasAnno = field.isAnnotationPresent(MyAnno.class);
if(fieldHasAnno){
MyAnno fieldAnno = field.getAnnotation(MyAnno.class);
//注入注解属性
String name = fieldAnno.name();
person.setName(name); }
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} return person;
} private T obj; public T getObj(){
return obj;
} public TestClass(T obj) {
this.obj = obj;
}
}

4、执行结果,是注解中的name属性的值,测试完成。


tom

最新文章

  1. jquery在线扫雷
  2. SELECT控件操作的JS代码示例
  3. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式
  4. 集群服务器 时间同步 - Chrony
  5. Android Spinner控件数据绑定
  6. js 选项卡实现
  7. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别
  8. hibernate持久化操作注意
  9. c++ smart pointer
  10. php:兄弟连之面向对象版图形计算器1
  11. CodeForces 447C DZY Loves Sequences DP
  12. UVA 707 - Robbery(内存搜索)
  13. WebForm和Asp.Net MVC的理解
  14. Android UI(四)云通讯录项目之云端更新进度条实现
  15. 2D射影空间,为何引入射影空间
  16. log4net写入日志到sqlserver数据库
  17. MUI 拍照或选取照片上传作为头像
  18. 基于Java对图片进行二值化处理
  19. December 03rd 2016 Week 49th Saturday
  20. SharePoint自动化系列——通过PowerShell创建SharePoint List Items

热门文章

  1. lua转换etcd应答
  2. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法
  3. C++于public、protected和private说明(From MSDN)
  4. 图形化界面安装oracle报错Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set.
  5. You don&#39;t have permission to access / on this server问题的解决.
  6. JAVASCRIPT高程笔记-------第六章 面向对象的程序设计
  7. C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale(&quot;chs&quot;));本地化解析编码
  8. php 获取今日、昨日、本周,上周、本月,上月,季度的起始时间戳和结束时间戳的方法
  9. mariadb 允许远程访问
  10. iOS9 Spotlight使用