如何实现自定义Java运行时注解功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现自定义Java运行时注解功能相关的知识,希望对你有一定的参考价值。

相信大家在android开发过程中,对注解有一定程度的接触,比如我们在使用EventBus的时候,我们声明
@Subscribe(threadMode = ThreadMode.MainThread)

来接受通过EventBus发出来的数据,
还有ButterKnife,我们在使用OnClick添加点击事件或Bind绑定组件的时候,同样也有类似的写法
@Bind(R.id.index_image)
@OnClick(R.id.index_layout)

以至于什么@Override、@Deprecated、@SuppressWarnings这就不需要说了。
我们在写的时候,最大的感触就是:太方便了!!!直接加一个声明就Ok了。你是不是心动了,自己也写几个注解,是不是程序能够更加简洁一些了?先别急,看看注解的结构
@Retention(CLASS)
@Target(FIELD)
public @interface Bind
/** View ID to which the field will be bound. */
int[] value();


其实一点概念都不知道的话,确实看到这个会懵逼。我们一个个来解释一下
Retention 表示在什么级别保留此信息
SOURCE:源码注解,注解仅存在代码中,注解会被编译器丢弃
CLASS:编译时注解,注解会在class文件中保留,但会被VM丢弃
RUNTIME:运行时注解,VM运行期间也会保留该注解,因此可以通过反射来获得该注解
Target 表示作用域,可能的ElementType参数包括:
CONSTRUCTOR:构造方法声明
FIELD:字段声明
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类,接口或enum声明
Inherited 容许子类继承
Documented 生成javadoc时会包含注解
参考技术A 斑鸠粮恼过盛辈已

Java自定义注解+反射实现字典码值转换

一.定义自定义注解

@Retention(RetentionPolicy.RUNTIME)//什么时候使用该注解,这里定义为运行时
@Target(ElementType.FIELD)//注解用于什么地方,这里定义为作用于属性上
public @interface Dict 
    //字典类型,必需(创建字典时的key值)
    String key();
    //默认值,可选,值为null时使用默认值
    String defaultValue() default "";





   // OperateType operateType() default OperateType.ADD;
//   public static enum OperateType 
//       ADD("ADD", "1"),
//       UPDATE("UPDATE", "2"),
//       DELETE("DELETE", "3");
//
//       private String name;
//       private String index;
//
//       private OperateType(String name, String index) 
//           this.name = name;
//           this.index = index;
//       
//
//       public String getIndex() 
//           return this.index;
//       
//
//       public String getName() 
//           return this.name;
//       
//   


---------------------------------------------------------

以上是关于如何实现自定义Java运行时注解功能的主要内容,如果未能解决你的问题,请参考以下文章

scala 自定义实现枚举

自定义注解实现解密+单个属性解密

[转]Java中实现自定义的注解处理器

java注解如何自动触发?

Java如何自定义注解

Android自定义processor实现bindView功能