首页 > 编程 > Java > 正文

java注解简单讲解以及自定义注解例子

2019-11-08 02:09:27
字体:
来源:转载
供稿:网友
注解(Annotation)jdk5定义了4个标准的元注解。除了元注解,还有其它帮我们定义好的注解如@SupPRessWarnings  当然我们也可以自定义注解@Target,@Retention,@Documented,@Inherited@Retention@Retention定义了该Annotation被保留的时间长短. 如:@Retention(RetentionPolicy.SOURCE )该注解有三个值供选择:RetentionPolicy.SOURCE       这种类型的Annotations只在源代码级别保留,编译时就会被忽略RetentionPolicy.CLASS       这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略。默认就是这个值RetentionPolicy.RUNTIME      这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.如:@Override就是RetentionPolicy.SOURCE。      @SuppressWarnings也是RetentionPolicy.SOURCE 都是给编译看就没用了       @Deprecated是RetentionPolicy.RUNTIME这些都可以通过jdk的文档看到@Target用于描述注解的使用范围(即:被描述的注解可以用在什么地方) 有7个取值,当然可以设置多个取值,以数组的形式如@Target={ElementType.xxx,ElementType.xxx}。CONSTRUCTOR:用于描述构造器FIELD:用于描述域LOCAL_VARIABLE:用于描述局部变量METHOD:用于描述方法PACKAGE:用于描述包PARAMETER:用于描述参数TYPE:用于描述类、接口(包括注解类型) 或enum声明@DocumentedDocumented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中@Inherited允许子类继承父类的注解,这个注解我也没具体试过 不是很清楚用法下面举例说说怎么自定义注解(相关问题都有注释 这里就不多写了)自定义的注解类:
package com.Howard.test04;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 自定义注解类 * 但是必须要加上元注解 * @Retention(RetentionPolicy.RUNTIME)元注解 * @Target设定该注解的使用的目标 可以是方法或类等,也可以多个 * @author Howard * 2017年2月19日 */@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD,ElementType.TYPE})public @interface myAnnotation {     //属性 @myAnnotation(xxx="yyy")     //如果各个属性都没默认值 那么使用该注解必须注明所有属性的值     //如果有默认值的 可以不注明 注明则覆盖默认值     //如果属性是value的,并且只有这个属性或者其它属性有默认值不另赋值,那么vlue这个属性在注明的     //时候可以简单写为@myAnnotation("red")     String color() default "red";     String value();     int[] attr() default {1,2,3};     //属性也是一个注解 mataAnnotation也是一个自定义注解     mataAnnotation mataAnnotation() default @mataAnnotation("aaa");}
package com.Howard.test04;/** * @author Howard * 2017年2月19日 */public @interface mataAnnotation {     String value();}测试类:
package com.Howard.test04;/** * 测试java注解 * @author Howard * 2017年2月19日 */@myAnnotation(value="abc",attr={3,4,5},mataAnnotation=@mataAnnotation("bbb"))public class AnnotationTest {     @SuppressWarnings("deprecation")     public static void main(String[] args) {           //该方法已经过时 在方法上加注解@SuppressWarnings("deprecation")可以取消黄色提醒           System.runFinalizersOnExit(false);           //过时           method1();           //检测是该类否有注解          if(AnnotationTest.class.isAnnotationPresent(myAnnotation.class)){                myAnnotation annotation = AnnotationTest.class.getAnnotation(myAnnotation.class);                //该注解类必须有元注解才可以                //@com.Howard.test04.myAnnotation()                System.out.println(annotation);                //获取注解的属性值                System.out.println(annotation.color());                System.out.println(annotation.value());                System.out.println(annotation.attr().length);                System.out.println(annotation.mataAnnotation().value());           }     }     @Deprecated     public static void method1(){           //java为了可以向下兼容使用以前版本的jdk用户,并不会删除过时的方法,仅提醒而已           System.out.println("已经过时的方法,加注解就变成过时的方法");     }}运行结果:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表