本文共 3101 字,大约阅读时间需要 10 分钟。
前面学习了Filter的基本特点和做了几个练习,接下来学习注解,学习完注解,再来学习动态代理。本篇主要了解什么是注解,注解用来干嘛。总的来说,注解是框架定义的,解析也是框架来做,我们只需要学会使用注解就好。
什么是注解
从语法上来说,具备以下这种格式就是注解。
@注解名称 例如Junit中的@Test
以后在编程中看到@名称 就要想起这是一个注解。接下来看看注解有什么好处,也就是注解的作用。
注解的作用
使用注解就是用来取代配置文件,就是这么一个作用。例如在Servlet3.0中,我们可以不再需要使用web.xml来配置Servler和Filter等配置,全部可以采用注解来实现,这时候注解就取代了xml配置文件。注解的核心作用就是起到配置作用,配置包含定义和读取。
注解是由框架来读取和使用的
怎么来理解这个标题呢?第一小点,注解是有框架来定义的。例如Junit中@Test就是Junit框架来定义。第二小点,注解是由框架来解析和使用,还是Junit中,@Test表示以下方法是一个测试用例,这个是Junit来解析出来。
或者,拿我们java web动态项目中的web.xml,之前我们没有学习注解,我们Servlet和Filter都在web.xml中写入配置。这些配置都是框架来使用和读取,这里的框架,就是我们的web服务器,也就是tomcat。如果我们在web.xml中写入了错误的配置,tomcat在启动过程中读取到web.xml中存在错误,就会报错。
注解的使用
我们在学习和使用注解,可以从下面三点去着手。
其实,注解也是一个类,我们在一个类中定义了注解,一般这个定义注解都是框架来实现。然后开发人员只需要学会使用注解,一般常用的注解是需要掌握基本使用,然后再由框架解析和读取注解。
注解的定义举例
下来来用代码实现一个定义注解的过程。定义注解不能使用class,enum和interface,而是使用@interface
创建一个java 项目,在一个包下新建一个Demo1.java类。
package annotation;public class Demo1 { }/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ }
注解的使用
下面注解可以写在成员变量,方法参数,构造方法,类,方法的前面。
package annotation;@MyAnnotationpublic class Demo1 { @MyAnnotation private String name; @MyAnnotation public void fun1() { } public void fun2(@MyAnnotation String name) { @MyAnnotation String nickName = "hello"; }}/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ }
注解不可以写在 导包语句前面(其实也可以,但是没啥用),还有不能写在调用方法语句前面。
public void fun1() { @MyAnnotation System.out.println("Hello"); }
注解的作用目标
通过上面的注解使用代码练习,这里来总结下注解的作用目标
注解的属性
定义属性
格式: 类型 名称();
类型就是我们Java中熟悉的八大数据类型,名称就是熟悉别名,注意后面跟着一对小括号。小括号一定要有,不然会报错,小括号里也不能写参数。下面来看看代码中如何定义一个注解属性。
/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ String name(); int age();}
定义属性就是这样格式。
使用注解属性
下面来解释使用注解的时候,需要给属性赋值。定义了多少个就需要几个赋值,不然会报错。
package annotation;@MyAnnotation(name="tom", age=18)public class Demo1 { }/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ String name(); int age();}
属性写在小括号内,多个属性逗号隔开。如果学习过TestNG或者Junit的人,就明白这个属性赋值的作用。
注解属性的默认值
前面我们定义了name和age两个属性,也学会了使用注解属性赋值。有时候,注解属性是需要默认值,这个就需要在定义属性的时候提供默认值。
package annotation;@MyAnnotation(name="tom")public class Demo1 { }/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ String name(); int age() default 18;}
直接在定义属性的时候使用default后面跟着默认值。上面使用注解的时候,小括号里不写age属性赋值就表示使用默认值。
名为value的属性的特权
这是什么意思呢?如果你定义了一个属性,属性名称叫value, 当使用属性的时候,并且只给value赋值的时候,value=值1,可以简写成值1,这就是叫value的属性的特权。下面来代码演示下。
package annotation;@MyAnnotation("tom")public class Demo1 { }/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ String value(); int age() default 18;}
这里因为age有默认值,所以赋值的时候不需要给出具体值去覆盖18,就剩下value一个属性需要设置值,@MyAnnotation("tom") 相当于@MyAnnotation(value="tom"),这里value的特权就是可以省略value=这个字符串。
注解属性的类型
前面注解属性我们知道有8中基本数据类型,还使用了Sting类型,其实还有其他类型。
下面看看这些类型的定义和使用赋值的代码。
package annotation;@MyAnnotation( a = 100, b = "hello", c = MyEnum.A, d = String.class, e = @MyAnnotation2(), f = {"tom", "lisi"} )public class Demo1 { }/** * 定义注解 * @author Anthony * */@interface MyAnnotation{ int a(); String b(); MyEnum c(); Class d(); MyAnnotation2 e(); String[] f();}@interface MyAnnotation2 { }enum MyEnum { A,B, C}
转载地址:http://emxws.baihongyu.com/