Java注解Annotation的写法以及注意

来源:互联网 发布:时时彩开奖动画源码 编辑:程序博客网 时间:2024/06/10 13:07

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




原创粉丝点击