博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java注解技术
阅读量:7166 次
发布时间:2019-06-29

本文共 2356 字,大约阅读时间需要 7 分钟。

hot3.png

引言

    spring发展至今,已经从xml到注解加xml,到如今springboot主导的环境,像是一部摈弃xml转注解的史书。java5推出的注解可谓在各种开源框架大放异彩,发挥着重要的作用。有时候在实际项目中,有一些需求可以通过注解的方式灵活的进行配置等,就会自己写一个注解。根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。本文就打算写一个小小的注解demo,进入注解世界的大门。

元注解

    元注解的作用就是负责注解其他的注解。java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明,4个元注解是:

    主要作用 是用于描述注解的使用范围,即被描述的注解可以用在什么地方:

    construction构造器,Field成员变量,Local_Variable局部变量,method成员方法,package包,parameter参数,type类 接口 枚举类

@Retention

    主要表示需要在什么级别保存该注释信息,用于描述注解生命周期:

    runtime运行时有效 source源文件中有效 class编译文件中有效

@Documented

    用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,是一个标记注解

@Inherited

    是一个标记注解,阐述了某个被标注的类型是被继承的。如果使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将用于该class

自定义注解

   定义注解

    分为两步:通过@Interface关键字声明注解名称、注解成员属性等; 使用Java内置四个元注解对自定义标注的功能和范围进行约束。

    自定义注解的格式 public @interface 注解名{定义提},注解参数支持所有基本数据类型,String,Class类型,Enum类型。Annotation类型,以上所有类型的数组。下面自定义一个叫Tt的注解:

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Tt {    String value() default "";}

    Tt注解可以注解在方法上,如果想注解在多个地方,可以在Target注解属性内加一个数组,类似于@Target({ElementType.METHOD,ElementType.TYPE}) ,同时定义了注解是在运行时被使用(一般都是这样使用,当然比如lombok这种工具其实是在编译时期注解生效的,有兴趣可以看下lombok的源码)。

    注解处理

    如果没有注解处理的话,注解和注释一样,是没有作用的,所以我们需要对有注解的方法进行一些业务处理,我们在main函数启动的时候,在有tt注解的方法进行前后增加处理业务,完整代码如下:

public class DefineAnnotationTest {    @Test    public void testAnnotation() throws InvocationTargetException, IllegalAccessException {        DefineAnnotationTest d = new DefineAnnotationTest();        Method[] methods = DefineAnnotationTest.class.getMethods();                for (Method m : methods) {            if (m.isAnnotationPresent(Tt.class)){                String value = m.getAnnotation(Tt.class).value();                System.out.println("被Tt注解的  前置逻辑写在这里 ,注解参数值是 = " + value);                m.invoke(d,new Object[]{});                System.out.println("被Tt注解的  后置逻辑写在这里 ,注解参数值是 = " + value);            }        }    }    @Tt(value = "6666")    public void runWithTemplate() {        System.out.println("我的前后面 帮我包装下。类似于模板模式 或者 代理模式");    }    @Tt(value = "最弦民族风")    public void trytrytry(){        System.out.println("我就是来试试的");    }}

    这段代码的运行结果:

被Tt注解的  前置逻辑写在这里 ,注解参数值是 = 6666我的前后面 帮我包装下。类似于模板模式 或者 代理模式被Tt注解的  后置逻辑写在这里 ,注解参数值是 = 6666被Tt注解的  前置逻辑写在这里 ,注解参数值是 = 最弦民族风我就是来试试的被Tt注解的  后置逻辑写在这里 ,注解参数值是 = 最弦民族风Process finished with exit code 0

  看上去,我们的注解已经成功的起到了作用。

    

转载于:https://my.oschina.net/u/3470849/blog/1807228

你可能感兴趣的文章
【原创】Kafka producer原理 (Scala版同步producer)
查看>>
在运行时切换 WinForm 程序的界面语言 System.ComponentModel.ComponentResourceManager .ApplyResources...
查看>>
SSH框架总结(帧分析+环境结构+示例源代码下载)
查看>>
FME2014汉化问题
查看>>
【Servlet和JSP-学习-1】基础知识
查看>>
使用CSS3制图
查看>>
Pizza pieces
查看>>
OC 数据类型之间的转换方法
查看>>
Javascript J更深层次的理解avascript 基础知识
查看>>
如何定义AIDL跨进程间通信
查看>>
C语言,数据类型
查看>>
WPF 4.0 DatePicker 快速录入
查看>>
Google Protocol Buffers 快速入门(带生成C#源码的方法)
查看>>
HTML5 – 4.canvas
查看>>
[Data Structure & Algorithm] 七大查找算法
查看>>
MVC后台与前台交互的问题。。。
查看>>
EntityFramework之Log(五)
查看>>
[翻译] Icon and Image Sizes
查看>>
云计算设计模式(十八)——重试模式
查看>>
KBMMW 4.84.00 发布
查看>>