初级必备:Java自定义注解(Annotation)的学习与使用

    链接地址:http://www.xx566.com/detail/113.html

    注解(Annotation)是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代码中的一些元信息,在编 译、运行时进行解析和使用。Java内置了一些注解(如@Override、@Deprecated等),还支持自定义注解,一些知名的框架 Struts、Hibernate等都有自己实现的自定义注解,之前在项目中,自己定义过注解,主要用于过滤请求,控制action中方法的方法,有点拦 截器的味道,这里做下整理和总结。

    注解的定义使用的是是@interface关键字,这里有个元注解的概念,作用是负责注解其他注解,也就是对自己定义的注解进行说明,JDK1.5中有四 种元注解:@Retention @Target @Document @Inherited,下面做个简要介绍。

    @Retention,用于定义注解的保留策略,也就是注解的有效范围,有三种:

@Retention(RetentionPolicy.SOURCE)
注解在源码中存在,在class中不存在
@Retention(RetentionPolicy.CLASS)
默认的保留策略,注解在class中存在,在运行期无法获取
@Retention(RetentionPolicy.RUNTIME)注解在class中存在,在运行期可通过反射获取

    @Target,用于描述注解的使用范围,有以下几种:

@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)用于

    @Document,表示该注解将被包含在javadoc中

    @Inherited,表示子类可以继承父类中的该注解

    当然,上面的注解都很重要,不过对于我来说,更多是用到前两个,而且也常用自定义注解控制权限等,这篇的自定义注解的学习demo,也只需要前两个,对于那些有可能自定义框架的大牛来说,每种注解都很重要哦,下面我们开始自定义注解的实现。

    首先我们需要使用@interface定义一个注解,同时指定两个属性,一个名称,一个描述,如下:

package javase.annotation;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * 定义一个注解类,指定对类和方法有效,在运行期有效
 * 注解很像接口,对属性的定义类似于接口中方法的定义,
 * 需要使用括号()
 * @author Realfighter
 *
 */
@Target( { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Authority {
 
    /**
     *  名称,这里使用default指定默认值,
        在使用注解的时候不指定name,则为默认值
     */
    String name() default "";
 
    String describe();// 描述
 
}

    定义好了注解,我们简单写一个测试类,使用这个注解,如下:

package javase.annotation;
 
@Authority(describe = "注解类测试")
public class AnnotationTest {
 
    @Authority(name = "test", describe = "注解方法测试")
    public void test() {
        System.out.println("hello annotation");
    }
 
}

    很简单,是吧,那么我们又该怎么获取到注解里的描述信息呢,由于注解定义在运行期,那么我们可以利用class反射获取类的相关信息,具体示例代码如下:

package javase.annotation;
 
import java.lang.reflect.Method;
 
@Authority(describe = "注解类测试")
public class AnnotationTest {
 
    @Authority(name = "test", describe = "注解方法测试")
    public void test() {
        System.out.println("hello annotation");
    }
 
    public static void main(String[] args) {
        // 获取当前线程所在class
        Class<?> clazz = AnnotationTest.class;
        // 获取含有指定注解的类
        Authority authorityClass = (Authority) clazz
                .getAnnotation(Authority.class);
        if (authorityClass != null) {
            System.out.println(authorityClass.describe());
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {
                // 判断方法上是否存在指定的注解
                if (method.isAnnotationPresent(Authority.class)) {
                    Authority authorityMethod = method
                            .getAnnotation(Authority.class);
                    System.out.println(authorityMethod.describe());
                }
            }
        }
    }
     
}

转载于:https://my.oschina.net/realfighter/blog/349722

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值