您的位置:首页 > 编程语言 > Java开发

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

2017-02-19 23:22 447 查看
注解(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声明

@Documented
Documented 注解表明这个注解应该被 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("已经过时的方法,加注解就变成过时的方法");
}

}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: