自定义注解
什么是注解?
在Java开发中注解是我们经常使用的一大杀器,不仅如此而且随着springboot的广泛应用,基于Java注解方式的配置使用的也越来越频繁,注解以其简洁、优雅、与Java代码无缝对接的风格,越来越受到广大程序猿的追捧。现在甚者在使用mybatis框架时程序猿们也越来越喜欢使用Java注解配置的方式来管理SQL,而不再使用xml,这个注解使用的频率可谓是越来越多。但是猿们你们到底了解注解吗,你们有自定义注解过吗,知道注解到底是个啥吗?反正之前我是没去了解过,只是一味的在使用注解,所以今天我想跟大家一起分享一下这个注解到底是个啥。
注解到底是啥呢?
- 我们先来看看百度百科怎么解释的。
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值
注解也就是Annotation,相信不少人也和我之前一样以为和注释和doc一样,是一段辅助性的文字,其实注解不是这样的。
从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。
--(摘自:百度百科)
通过百度百科的介绍我们可以知道,注解在Java中称为元数据,所谓元数据就是描述数据的数据。通俗一点讲,注解就是具有特殊意义的注释。
- 那什么又是特殊意义的注释呢?
所谓特殊意义的注释,就是说我们的注解可以让被注解修饰的代码块具有特殊的意义或者特殊的功能,这个特殊意义也可以让我们在使用该代码块时进行一些特殊的操作。
通过上面这些描述我相信大家对注解应该有了一定的了解,但是所谓无图无真相,实践才是检验整理的唯一标准。我们只有自己去自定义一下注解才能更加深刻的理解注解。
如何自定义注解?
- 新建一个annotation命名为Test,代码如下:
/**
* @AnnotationName Test
* @Description 自定义测试注解,主要是为了学习理解注解
* @Author wuyuqing
* @Date 2020/8/10 0:55
* @Version 1.0
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
boolean value() default true;
}
- 新建一个测试类RunTestMyAnnotation,代码如下:
/**
* @ClassName RunTestMyAnnotation
* @Description 测试自定义注解
* @Author wuyuqing
* @Date 2020/8/10 0:59
* @Version 1.0
*/
public class RunTestMyAnnotation {
@Test
public void one() {
System.out.println("one");
}
@Test(value = false)
public void two() {
System.out.println("two");
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
RunTestMyAnnotation runTestMyAnnotation = new RunTestMyAnnotation();
for (Method method : runTestMyAnnotation.getClass().getMethods()) {
Test annotation = method.getAnnotation(Test.class);
if(annotation != null && annotation.value()){
method.invoke(runTestMyAnnotation);
}
}
}
}
通过上述简单的实例,我们便可以简单的,实现一个具有单元测试功能的注解,我们可以选择性的执行某个方法。
虽然上述的实例特别简单,但是我们最主要的目的,是为了理解,注解是用来描述数据的数据。就是让被注解修饰的代码块具有特殊意义的,我们可以通过获取注解来执行我们的特定操作。
当然了,之所以讲这么多说这么多,还有一个很重要的原因就是上面提到过的,注解简洁、优雅、与Java代码无缝对接的风格对比使用xml来进行配置简直不要太爽。就像上面的简单测试样例利用xml该怎么描述呢?我想应该是这样的:
<test>
<test-clss name="com.test.RunTestMyAnnotation">
<test-method name="one"></test-method>
<test-method name="one" value="false"></test-method>
</test-clss>
</test>
这样是不是太繁琐,太不友好了,我仅仅只是为了执行一下单元测试,居然要写这么多配置文件,简直是浪费时间。对比看看注解代码简洁明了,简直不要太友好了。
注解就没有缺点吗?
当然不是了,大自然的规律造就了,没有绝对完美存在的规律。例如CPU跑的快但是容量小,内存速度容量都不错但是不能持久化,磁盘虽然慢但是支持持久化。所以我们的注解也有自身的缺陷:
- 注解写在Java代码中,编程确实够友好。但是这对于诸如数据库配置信息,指不定就要修改的数据,我们写在配置文件中是不是不太友好了?每次修改配置信息,就要改代码打包编译上传,这简直就是折腾人嘛。
- 还有配置信息零散的分布在各个Java文件中,是不是也不太便于管理呢?
所以说嘛,凡事无绝对,通常情况我们还是配合着xml一起在使用注解最好,毕竟各有千秋嘛。