深入了解注解及其使用

深入了解注解及其使用

注解是什么

注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。

1、什么是元注解

用于对注解类型进行注解的注解类,称之为元注解。JDK1.5中提供了4个标准元注解。

@Target: 描述注解的使用范围,说明被它所注解的注解类可修饰的对象范围
@Retention: 描述注解保留的时期,被描述的注解在它所修饰的类中可保留到何时
@Documented: 描述在使用Javadoc工具为类生成帮助文档时是否要保留其注解信息
@Inherited: 使被它修饰的注解修饰的注解类的子类能继承到注解

2、元注解@Target的取值及其含义

@Target({ElementType.FIELD, ElementType.METHOD})
public @interface Event {
}

@Target描述的是注解的使用范围,携带的值为枚举,作用是标明它修饰的注解可以用在哪些地方。比如上述例子中的@Event只能作用于属性和方法上

ElementType的取值和意义如下:

public enum ElementType {
	//作用在类上
	TYPE,	
	
	//作用在属性上
	FIELD,	
	
	//作用在方法上
	METHOD,	
	
	//作用在参数上
	PARAMETER,	
	
	//作用在构造器上
	CONSTRUCTOR,	
	
	//作用在局部变量上
	LOCAL_VARIABLE,	
	
	//作用在注解上
	ANNOTATION_TYPE,
	
	//作用在包名上
	PACKAGE,	
	private ElementType(){...}
}

注意:每个注解可以跟n个ElementType关联。当无指定时,注解可用于任何地方。

3、元注解@Retention的取值及其含义

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
}

@Retention描述的是注解的存在时期。如上述例子中@Event为运行时注解,在源码,字节码及运行时皆存在

RetentionPolicy取值和意义如下:

public enum RetentionPolicy {
	//源码时注解, 只在源码中存在,编译后便不存在了
	SOURCE, 
	
	//编译时注解,源码和编译时存在,运行时不存在
	CLASS,
	
	//运行时注解,源码,编译时,运行时都存在
	RUNTIME;
	
	private RetentionPolicy(){...}
}

注意:每个注解只能和一个RetentionPolicy关联。当无指定时,默认为RetentionPolicy.CLASS

4、其他元注解介绍

@Documented: 类和方法的Annotation在缺省情况下是不出现在javadoc中的。如果使用@Documented修饰该注解,则表示它可以出现在javadoc中。

@Inheried: 当使用该注解的类有子类时,注解在子类仍然存在。通过反射其子类可获得父类相同的注解

5、自定义注解的参数

public @interface Person {
	public String name();
	//默认值
	int age() default 18;
	int[] array();
}

注解能够携带的参数类型有:基本数据类型,String, Class, Annotation, enum

注解的使用

注解目前比较常见的使用场景有
a、编译时动态检查,比如某参数的取值只能为某些int值,如颜色。则可以使用编译时注解在编译时对参数进行检查
b、编译时动态生成代码,使用注解处理器在编译时生成class文件。如ButterKnife实现
c、运行时动态注入,用注解实现IOC,许多框架将原有配置文件xml改成注解用的便是IOC注入。

1、编译时注解-Apt注解处理器使用

下面以实际案例讲解。案例目标:
实现注解绑定控件,效果如下

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tv)
    public TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Toast.makeText(thi
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值