Java注解技术

引言

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

元注解

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

@Target

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

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值