三、自定义注解

注解的使用我就不讲了.这里讲讲自定义注解吧.学习自定义注解之前,要先了解几个元注解(用来修饰注解的注解=.=)

元注解

@Target

作用

用来标注注解的作用域

源代码

@Documented  //可以包含在文档中
@Retention(RetentionPolicy.RUNTIME) //annotaion保留级别
@Target(ElementType.ANNOTATION_TYPE)  
public @interface Target {  
    ElementType[] value();  
}  

参数

@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) ///包   

由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等

@Document

作用

说明该注解将被包含在javadoc中

源代码

@Documented
@Retention(RetentionPolicy.RUNTIME)//在class中可反射得到
@Target(ElementType.ANNOTATION_TYPE)//修饰注解类型
public @interface Documented {
}

参数

@Retention

作用

注解的保留级别

源代码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

参数

取值

java.lang.annotation.RetentionPolicy

SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留)
RUNTIME:在运行时有效(即运行时保留)

@Inherited

作用

说明子类可以继承父类中的该注解

源代码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

参数

自定义注解

最简单注解

//注解
public @interface SimpleAnnotation {
}
//被注解的类
@SimpleAnnotation
public class AnnotationTest {
}

带参数的注解

//注解
@Target(ElementType.METHOD) //作用于方法
public @interface ParamAnnotation {
    String[] value1() default "abc";
    String valuxxx() default  "hello world";
}
//被注解的类
@SimpleAnnotation
public class AnnotationTest {
    @ParamAnnotation
    public void setName(){}

}

读取注解信息

public class ParamExplain {
    //方法注解
    public static <T> void parseMethodAnnotation(Class<T> clazz) {
        T obj = null;
        try {
            obj = clazz.newInstance();
            for (Method method : clazz.getDeclaredMethods()) {
                ParamAnnotation methodAnnotation = method.getAnnotation(ParamAnnotation.class);
                if (methodAnnotation != null) {
                    //通过反射调用带有此注解的方法
                    Log.e("value1=", methodAnnotation.valuxxx());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    //获得类注解
    public static <T> void parseClassAnnotation(Class<T> clazz) {
        T obj = null;
        try {
            obj = clazz.newInstance();
            SimpleAnnotation simpleAnnotation = (SimpleAnnotation) clazz.getAnnotation(SimpleAnnotation.class);
            if (simpleAnnotation != null) {
                Log.e("simpleAnnotation=", "simple annotation find");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

被注解的类

@SimpleAnnotation
public class AnnotationTest {
    @ParamAnnotation(valuxxx = "Not default")
    public void setName(){}

}

测试

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.test_tv);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ParamExplain.parseMethodAnnotation(AnnotationTest.class);
                ParamExplain.parseClassAnnotation(AnnotationTest.class);
            }
        });
    }
}

运行结果

value1=: Not default
simpleAnnotation=: simple annotation find

谢谢http://blog.csdn.net/yixiaogang109/article/details/7328466

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值