Java Annotation注解

48 篇文章 2 订阅

参考:Java官方文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.6

一、注解类型:

是一种特殊类型的interface,区别在于注解声明是 @interface

二、示例:(Android 框架一般怎么用注解省代码的)

1.注解的声明

@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnno {
	public int viewId();
}

2.注解的使用

public class MainActivity extends Activity {
        @TestAnno(viewId = R.id.view)
	private View view;

        @Override
	protected void onCreate(Bundle savedInstanceState) {
AnnoUtil.assignView(this);
         }
}

 

 
 

3.代码中使用注解信息(就是框架里常做的)

public class AnnoUtil{
	public static void assignView(Activity context){
		Field[] fields = context.getClass().getDeclaredFields();
		for (Field field : fields) {
			TestAnno  anno = field.getAnnotation(TestAnno.class);
			if (anno != null) {
			//为了访问private常量,需要取消 读取检查
				field.setAccessible(true);
				try {
					field.set(context, context.findViewById(anno.viewId()));
				} catch (IllegalArgumentException e) {
				e.printStackTrace();
				} catch (IllegalAccessException e) {
				e.printStackTrace();
				}
			}
		}
	}
}

(一般框架就是这么搞的了,这样也确实挺省代码的

三、特点:

1.java的注解不可显式声明父类(实际上他们都继承了Annotation类,但是你在声明时无法使用extends 关键字),也无法被泛化。

2.方法:

a) 每个方法都定义了该注解中的一个元素Each method declaration in an annotation type declaration defines an element of the annotation type)。

(擦!不看文档我一直以为注解没有方法,因为他用方法名称赋值比如 @

b) 注解中的方法形参不可以有参数

c) 注解中的方法不可以抛出异常

d)方法的返回值(即注解的element)必须是如下之一: a primitive type(基础类型:int、float等), StringClass, parameterized invocation of Class, enum, annotation,array

parameterized invocation of Class :在java 5后java.lang.Class为泛型类,意味着他可以有类型参数,具体指Class<...>的形式,举例: Class<? extends Formatter> value();

e)如果方法的声明中没有加 default 关键字,则必须在使用泛型是进行赋值

d) 如果想建立框架,在运行期间通过反射调用注解,需要你的注解加上注解@Retention(RetentionPolicy.RUNTIME),否则注解可能在编译期间就消除了。


3.如无特殊声明,注解和interface一样(都是静态的字段)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值