扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:IT专家网 2008年5月5日
关键字: Annotation java
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 | 说明 |
@Target | 1. 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) |
@Retention | 1. SOURCE//按照规定使用注释,但是并不将它保留到编译后的类文件中 2. CLASS//将注释保留在编译后的类文件中,但是在运行时忽略它 3. RUNTIME//将注释保留在编译后的类文件中,并在第一次加载类时读取它 |
@Documented | Documented 表示注释应该出现在类的 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");//没有使用范型,类型不安全 } } |
1.一个组合的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()); } } } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者