Java中的Annotation解析之二(1)

 

一、Java 中的Annotation的定义

Java中的Annotation

Java定义了几个标准的meta-annotation,在新Package中java.lang.annotation 中包含了以下meta-annotation:

meta-annotation 说明

@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。

meta-annotation说明
@Target1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。
2. ElementType的定义
TYPE// Class, interface, or enum (but not annotation)

FIELD// Field (including enumerated values)
METHOD// Method (does not include constructors)
PARAMETER// Method parameter
CONSTRUCTOR// Constructor
LOCAL_VARIABLE// Local variable or catch clause
ANNOTATION_TYPE// Annotation Types (meta-annotations)
PACKAGE// Java package

@Retention1. SOURCE//按照规定使用注释,但是并不将它保留到编译后的类文件中
2. CLASS//将注释保留在编译后的类文件中,但是在运行时忽略它
3. RUNTIME//将注释保留在编译后的类文件中,并在第一次加载类时读取它
@DocumentedDocumented 表示注释应该出现在类的 Javadoc 中
@Inherited一个Annotation将被继承

三个标准的Annotation 在java.lang包中:

@Deprecated对不再使用的方法进行注释
@Override指明注释的方法覆盖超类的方法
@SuppressWarnings阻止编译器的警告,例:当类型不安全时

下例来说明这三个标准的Annotation:

package sz.starbex.bill.annotation;
import java.util.ArrayList;
import java.util.List;
public class SimpleOverrideAnnotation {
public static void main(String[] args) {
SimpleOverrideAnnotation test = new SimpleOverrideAnnotation();
System.out.println(test.toString());
}
@Override
public String toString() {
return "自己的类自己输出";
}
@Deprecated
public void doSomething() {
System.out.println("方法已过时" );
}
@SuppressWarnings(value={"unchecked"})
public void testSuppressWarnings(){
List testList=new ArrayList();
testList.add("KKKK");//没有使用范型,类型不安全
}
}

二、Annotation使用实例

一个组合的Annotation,注释类的

a. 商标Annotation

package sz.starbex.bill.annotation;
public @interface Trademark {
String name();
String owner();
}

b.License的annotation

package sz.starbex.bill.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface License {
String name();
String notice();
boolean redistributable();
Trademark[] trademarks();
}

c.测试类

package sz.starbex.bill.annotation;
@License(name="Bill",
notice="许可证",
redistributable=true,
trademarks={@Trademark(name="Mercedes",owner="Swedish"),
@Trademark(name="Daewoo",owner="Korean")
}
)
public class TestLicenseAnnotation {
public static void main(String[] args) {
TestLicenseAnnotation test=new TestLicenseAnnotation();
License license=test.getClass().getAnnotation(License.class);
System.out.println("License发放人:"+license.name());
System.out.println("License注意事项:"+license.notice());
System.out.println("License许可:"+license.redistributable());
Trademark [] marks=license.trademarks();
for(Trademark mark:marks){
System.out.println("商标名称:"+mark.name());
System.out.println("商标的使用者:"+mark.owner());
}
}
}

作者:管斌(http://blog.matrix.org.cn/page/guanbing)
原文地址:http://www.matrix.org.cn/resource/article/44/44336_Java+Annotation.html

(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值