Java自定义注解及注解的使用
2015-11-29 21:11
866 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/songlin0859/article/details/50099461
定义了注解,在定义属性和方法时使用了注解,但是注解的使用还要去解析
然后在main方法中测试
结果如下
纯粹就是自己学习的一个胡乱总结啊,勿喷,贴的都是代码,但是耽美注释很详细啊
Annotation,是Java5的新特性……
1、自定义注解
如何自定义一个注解,看下面的代码,其实代码没几句,都是注释,写的很详细,看完就会自定义注解了
package com.sl.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Retention; * 指定被修饰的Annotation可以保留多长时间; * 只有一个参数,参数类型RetentionPolicy value(); * 可以@Retention(RetentionPolicy.XXX)或者@Retention(value=RetentionPolicy.XXX) * 两种用法;参数的值有三个: * RetentionPolicy.SOURCE Annotation只保留在源码中 * RetentionPolicy.CLASS Annotation保留在源码和class文件中 * RetentionPolicy.RUNTIME Annotation记录在class中,当java程序运行时也会保留在JVM中 */ @Retention(RetentionPolicy.RUNTIME) /** * @Target * 指定被修饰的Annotation能用于修饰哪些程序单元 * 只有一个参数,参数类型ElementType[] value(); * 只需要修饰一个target时可以@Target({ElementType.METHOD})或@Target(ElementType.METHOD) * 当修饰的target有多个时,则@Target({ElementType.METHOD,ElementType.FIELD}),target不能重复 * 参数值如下: * ElementType TYPE; 类、接口、枚举 * ElementType FIELD; 成员变量 * ElementType METHOD; 方法 * ElementType PARAMETER; 参数 * ElementType CONSTRUCTOR; 构造函数 * ElementType LOCAL_VARIABLE; 局部变量 * ElementType ANNOTATION_TYPE; 只能修饰Annotation * ElementType PACKAGE; 修饰包 */ @Target({ElementType.METHOD,ElementType.FIELD}) /** * 修饰后,Annotation将具有继承性,也就是对被Annotation修饰的类的子类也有效 * 但是!annotations on implemented interfaces have no effect. * 也就是这个修饰对于接口interface无效 */ @Inherited /** * 修饰后Annotation能被javadoc提取为文档 */ @Documented /** * 定义一个Annotation * 用@interface修饰,和定义interface很像 */ public @interface Song { /** * 1、 * 定义成员变量: * 以无参的方法形式声明,其方法名和返回值定义了该成员变量的名字和类型,如: * String name();成员变量名为name,类型为String如果要设默认值的话可以加default valu * String name() default "songlin"; */ /** * 2、 * 没有定义成员变量的Annotation类型成为标记,如@Override */ /** * 3、 * 如果只有一个成员变量时,变量名取名value,如: * String value(); */ /** * 4、多个成员变量时: */ String name(); int age(); String desc() default "desc"; /**-------------------Annotation定义完成!!!-----------------*/ }超级简单! 2、使用注解,注解的使用和public、void、static 、final的用法差不多,只不过习惯上喜欢单独放一行
package com.sl.annotation; public class Person { @Song(age = 12, name = "songlin") public int age; @Song(age = 11, name = "sl" ,desc="this is a name") public String name; public Person(){}; public Person(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } @Song(age = 0, name = "dfgs") public void setAge(int age) throws Exception { throw new Exception(); } @Song(age = 1, name = "ddddd") public String getName() { return name; } public void setName(String name) { this.name = name; } }
定义了注解,在定义属性和方法时使用了注解,但是注解的使用还要去解析
package com.sl.annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ParseSongAnno { public static void parseSongAnno(Person p){ Class<? extends Person> clz=p.getClass(); Field[] fields = clz.getFields(); for (Field field : fields) { if (field.isAnnotationPresent(Song.class)) { System.out.println("Field name="+field.getName()); Song annotation = field.getAnnotation(Song.class); System.out.println("Anno:\tage:"+annotation.age()+"\tname:"+annotation.name()+"\tdesc:"+annotation.desc()); } } Method[] methods = clz.getMethods(); for (Method method : methods) { if (method.isAnnotationPresent(Song.class)) { System.out.println("Method name="+method.getName()); Song annotation = method.getAnnotation(Song.class); System.out.println("Anno:\tage:"+annotation.age()+"\tname:"+annotation.name()+"\tdesc:"+annotation.desc()); } } } }
然后在main方法中测试
package com.sl.annotation; public class AnnotationTest1 extends AnnotationTest{ public static void main(String[] args){ ParseSongAnno.parseSongAnno(new Person()); } }
结果如下
Field name=age Anno: age:12 name:songlin desc:desc Field name=name Anno: age:11 name:sl desc:this is a name Method name=setAge Anno: age:0 name:dfgs desc:desc Method name=getName Anno: age:1 name:ddddd desc:desc
纯粹就是自己学习的一个胡乱总结啊,勿喷,贴的都是代码,但是耽美注释很详细啊
相关文章推荐
- Java自定义注解的定义与使用
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
- java自定义注解及注解使用(注解学习一)
- Java自定义注解(annotation)基本使用
- JAVA 自定义注解在自动化测试中的使用
- J2EE之java自定义注解在项目中的使用
- 使用Spring AOP结合自定义Java注解实现动态数据源设置
- java自定义注解及注解使用
- 如何使用java自定义注解?demo
- Java注解的作用,使用,自定义
- java注解的自定义和使用
- java注解自定义使用
- Java自定义注解的实现与使用
- Java注解(自定义方法注解使用及测试)
- java反射以及自定义注解二者的使用
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
- JAVA 自定义注解在自动化测试中的使用
- java 自定义注解使用
- JAVA自定义注解的使用和定义
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句