Java注解的实现与使用方法

Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,特此说明一下。

如何创建一个注解

每一个自定义的注解都由四个元注解组成,这四个元注解由java本身提供:

@Target(ElementType.**)

这是一个枚举,它置顶是该自定义的注解使用的地方,像类、变量、方法,参数等

public enum ElementType {

/** Class, interface (including annotation type), or enum declaration */

TYPE,

/** Field declaration (includes enum constants) */

FIELD,

/** Method declaration */

METHOD,

/** Formal parameter declaration */

PARAMETER,

/** Constructor declaration */

CONSTRUCTOR,

/** Local variable declaration */

LOCAL_VARIABLE,

/** Annotation type declaration */

ANNOTATION_TYPE,

/** Package declaration */

PACKAGE,

/**

* Type parameter declaration

*

* @since 1.8

*/

TYPE_PARAMETER,

/**

* Use of a type

*

* @since 1.8

*/

TYPE_USE

}

@Retention(RetentionPolicy.**)作用是标明注解保存在什么级别,像在编译时、class文件中,vm运行中。

public enum RetentionPolicy {

SOURCE,

CLASS,

RUNTIME

}

用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;

用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;

用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时

@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同

@Inherited : (可以不写,标识是否继承父类注解)在您定义注解后并使用于程序代码上时,预设上父类别中的注解并不会被继承至子类别中,您可以在定义注解时加上java.lang.annotation.Inherited 限定的Annotation,这让您定义的Annotation型别被继承下来。

 

代码呈现:

1.定义一个注解

package com.tjbsl.myAnnotation;
import java.lang.annotation.*;
/**
 * @author tjbsl
 */
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Tjbsl {
    String name() default  "";
}

2.引用注解

package com.tjbsl.myAnnotation;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class TjbslTest {
 
    public static void main(String[] args) {
        try {
            Method doSoming = TjbslTest.class.getMethod("doSoming");
            TjbslTest instance = TjbslTest.class.newInstance();
            //执行反射
            doSoming.invoke(instance,null);//execute doSoming
 
            //判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
            if(doSoming.isAnnotationPresent(Tjbsl.class)){
                //执行注解
                System.out.println("注解:"+doSoming.getAnnotation(Tjbsl.class));//@com.tjbsl.myAnnotation.Tjbsl()
                Tjbsl annotation = doSoming.getAnnotation(Tjbsl.class);
                System.out.println("注解name:"+annotation.name());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
 
    @Tjbsl(name = "zhangsanfeng")
    public void doSoming(){
        System.out.println("execute doSoming");
    }
}

3.引用升级版-web项目中,对使用注解的类打印执行时间

 

在Intercepter中进行调用注解方法判断,实现此注解的方法,操作打印执行时间等..TODO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值