现许多流行框架都有注解配置,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等开源框架的注解写法。