java 注解详解
1.1 注解的概述
注释你还记得么?开个玩笑而已!
注释是给人看的,而注解是给程序看的!
注释是用来替代配置文件的!你回忆一下,我们以前总是要写一些配置文件,例如web.xml你还记得么?里面要写和!谁来读配置文件呢?当然是Tomcat!谁来写配置文件呢?当然是我们来写了!
在Servlet3.0中就可以使用使用注解来代替配置文件,开发者就不用再写配置文件了,而是写注解,然后Tomcat来读取注解。
注解也是类,需要定义了才能使用!
分别在Servlet3.0中有一个注解类为@WebServlet,然后我们就可以在Servlet中使用@WebServlet中使用这个注解了。这个注解就是用来替代了。然后Tomcat会通过反射来读取注解中的信息!
1.2 java中的注解
@Overrid:作用在方法上的注解。当方法不是重写父类的方法时会报错;
@Deprecated:作用在方法上。标记该方法为作废方法(已过时);
@SuppressWarnings:作用在方法上,压制警告。
1.3 定义注解类
定义注解类不能使用class、enum,也不能使用interface,而是使用@interface。
public @interface MyAnn{}
1.4 使用注解
注解可以作用在:类(接口或枚举)、属性、方法、构造器、包、参数、局部变量
@MyAnn
public class MyClass {
@MyAnn
private int a;//属性使用注解
@MyAnn
public MyClass() {}//构造方法使用注解
@MyAnn
public void fun1() {}//普通方法使用注解
@MyAnn
public void fun2(@MyAnn String s) {//参数使用注解
@MyAnn
int n = 10;
}
}
1.5 注解的属性
例如:
@interface MyAnn{
String value();
int vaue1(();
}
其中value就是属性!你可能会说,它是一个方法!没错,它是一个方法,但我们非要称之为属性,因为把它当做属性更加好理解。
当给注解的定属性后,就可以赋值
@MyAnn(value1=100,value="hello")
public class MyClass {
}
注解属性的默认值
public @interface MyAnn {
String value() default "hello world";//default 默认值属性
int value1();
}
在使用注解时,如果只给名为value的属性赋值,那么可以不给出属性的名称直接给出值。
public @interface MyAnn {
String value() default "hello world";
int value1() default 100;
}
@MyAnn()
public class MyClass {
}
@MyAnn(value="hello")
public class MyClass {
}
@MyAnn(value1=200)
public class MyClass {
}
@MyAnn(value="hello",value1=200)
public class MyClass {
}
@MyAnn("hello annocation")
public class MyClass {
}
@MyAnn(300)
public class MyClass {
}
@MyAnn("hello",value1=200)
public class MyClass {
}
1.6 注解的作用目标
在定义注解时可以限制注解的作用目录!例如让注解只能作用在类和方法上。
这需要使用元注解:@Target。该注解有一个属性value,类型为ElementType[],它是枚举类型。
//注解类的定义
@interface XmlAnnotation{
String person() default "亚洲人";//属性,默认值为亚洲人
String head() default "非洲头";//同上,注意,这不是方法,是简单的理解为属性
String body() default "落体";
String value() default "人体奥秘";
}
@interface FunctionAnn{
String content() default "特殊功能";
//对于这个value特殊的属性来说,可以用value=“”,也可以直接在括号中使用“”
String value();
}
//在定义注解时,可以使用@Target注解来限制注解的作用目标:\
//只能作用在class上和method上,也就是类和方法上
@Target({ElementType.TYPE,ElementType.METHOD})
@interface AnnMethod{
}
//只能作用在类上
@Target({ElementType.TYPE})//元注解---jdk自带的
@interface AnnClass{
}
2.7 注解的保留政策
注解的保留策略是指,注解是只保留在源代码上,还是保留到class文件上,再或者是类在运行时,可以被类加载器加载到内存中。
如果希望注解被反射,那么注解就要保留到运行时,而不是源代码或类文件上。
指定注解的保留策略需要使用元注解@Retention,它有一个value属性,类型为RetentionPolicy类型,RetentionPolicy是枚举类型:
public @interface Retention {
RetentionPolicy value();
}
public enum RetentionPolicy {
SOURCE, CLASS, RUNTIME
}
//下面代码是指定注解保留到运行时
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAnn {
String value() default "hello";
int value1() default 100;
}
下期整理反射!