现许多流行框架都有注解配置,Java注解是JDK1.5以后引入的一个特性。它可以使用在类、方法、数据字段上。注解是与反射配合使用的,可以通过Class类的getAnnatation等方法获取注解。
先来看看怎么编写注解吧。
1、声明。
声明类使用的是class关键字,接口是interface关键字,声明注解使用的是@interface关键字,如下:
public @interface MyAnnatation {
}
2、编写注解的内容。
public @interface MyAnnatation {
//为注解声明一个username属性,默认值为空串
public String username() default "";
//value属性没有默认值
public String value();
public String sex() default "man";
}
3、编写完成后最重要的是要在注解类上加上几个注解,以表示该注解类是用来注解什么的。最终如下:
@Documented //文档声明,会被javadoc文档工具记录
//声明注解类注解的范围,是变量,还是方法,还是类,还是参数
@Target(value={ElementType.FIELD,ElementType.METHOD,ElementType.TYPE,ElementType.CONSTRUCTOR})
//最重要的一个
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnatation {
//为注解声明一个username属性,默认值为空串
public String username() default "";
//value属性没有默认值
public String value();
public String sex() default "man";
}
最重要的属于给注解类加上@Retention注解。该注解有三个值,SOURCE、CLASS、RUNTIME。
我们知道java源文件经过javac指令后被编译成class字节码(Byte Code)文件,再经JVM解析执行class文件。
SOURCE表示注解只会存在于源文件(.java)中,经过编译后class文件中就不存在该注解。
CLASS表示经过编译后任然会存在与class文件中,但经JVM解析后不会出现在内存中。
RUNTIME则比CLASS更近一步,运行时仍能生效。
编写完成后,试一试怎么使用注解吧!
1、新建User类,在User的其中一个属性或者方法上使用MyAnnatation注解。
public class User {
private String username;
private String password;
@MyAnnatation(value="我是getUsername方法",username="zs")
public String getUsername() {
return username;
}
@MyAnnatation(value="我是setUsername方法")
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、通过反射获取MyAnnatation的值。
public class TestAnnatation {
public static void main(String[] args) throws Exception{
@SuppressWarnings("rawtypes")
Class clz = Class.forName("org.yamikaze.model.User");
Method[] methods = clz.getDeclaredMethods();
for(Method method : methods) {
//判断方法上是否声明了MyAnnatation注解
if(method.isAnnotationPresent(MyAnnatation.class)) {
//相应操作
//获取方法上的注解
MyAnnatation ma = method.getAnnotation(MyAnnatation.class);
System.out.println(ma.value() + "," + ma.username() + "," + method.getName());
}
}
}
}
结果:
这儿只是做的简单的操作,注解只有与反射配合才能发挥出作用,比如hibernate-validator验证框架,Mybatis的参数Param注解,Spring的Service、Controller、Repository等注解。
由于编写注解比较简单(认为难的表打我/(ㄒoㄒ)/~~),建议多看下Spring等开源框架的注解写法。