博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java注解不完全总结
阅读量:6695 次
发布时间:2019-06-25

本文共 6688 字,大约阅读时间需要 22 分钟。

Java注解注解越来越多的在开源框架使用,spring、struts2、junit等等,离开注解技术,这些框架的易用性会大大降低。

注解表面上很简单,容易被轻视,实际上要彻底搞清楚其中的规则并加以灵活运用,却很难!

因为要自己定义设计一些注解,这里做个查漏补缺,顺便总结下:

1、注解是针对Java编译器的说明。可以给Java包、类型(类、接口、枚举)、构造器、方法、域、参数和局部变量进行注解。Java编译器可以根据指令来解释注解和放弃注解,或者将注解放到编译后的生成的class文件中,运行时可用。

2、注解和注解类型

注解类型是一种特殊的接口类型,注解是注解注解类型的一个实例。

注解类型也有名称和成员,注解中包含的信息采用键值对形式,可以有0个或多个。

3、Java中定义的一些注解:

@Override 告诉编译器这个方法要覆盖一个超类方法,防止程序员覆盖出错。

@Deprecated 这个标识方法或类(接口等类型)过期,警告用户不建议使用。

@SafeVarargs JDK7新增,避免可变参数在使用泛型化时候警告”执行时期无法具体确认参数类型“,当然,也可以用@SuppressWarnings来避免检查,显然后者的抑制的范围更大。

@SuppressWarnings(value={"unchecked"}) 抑制编译警告,应用于类型、构造器、方法、域、参数以及局部变量。 value是类型数组,有效取值为:

   all, to suppress all warnings

   boxing, to suppress warnings relative to boxing/unboxing operations

   cast, to suppress warnings relative to cast operations

   dep-ann, to suppress warnings relative to deprecated annotation

   deprecation, to suppress warnings relative to deprecation

   fallthrough, to suppress warnings relative to missing breaks in switch statements

   finally, to suppress warnings relative to finally block that don't return

   hiding, to suppress warnings relative to locals that hide variable

   incomplete-switch, to suppress warnings relative to missing entries in a switch statement (enum case)

   javadoc, to suppress warnings relative to javadoc warnings

   nls, to suppress warnings relative to non-nls string literals

   null, to suppress warnings relative to null analysis

   rawtypes, to suppress warnings relative to usage of raw types

   restriction, to suppress warnings relative to usage of discouraged or forbidden references

   serial, to suppress warnings relative to missing serialVersionUID field for a serializable class

   static-access, to suppress warnings relative to incorrect static access

   static-method, to suppress warnings relative to methods that could be declared as static

   super, to suppress warnings relative to overriding a method without super invocations

   synthetic-access, to suppress warnings relative to unoptimized access from inner classes

   unchecked, to suppress warnings relative to unchecked operations

   unqualified-field-access, to suppress warnings relative to field access unqualified

   unused, to suppress warnings relative to unused code and dead code

4、注解的定义

使用 @interface 关键字声明一个注解

public @interface MyAnnotation1

注解中可以定义属性

String name default “defval”;

value是注解中的特殊属性

注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名

例如,声明一个注解:

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnno1 {

   String msg();

   int value();

}

5、一般注解

Java包括JSR250的一个实现“java平台的一般注解”,它规定针对一般概念的注解。这个JSR旨在避免不同的java技术定义类似的注解,从而造成重复。

遗憾的是,除了Generated之外,它里面规定的所有注解都是高级的资料,或者是适用于Java EE的,很多很杂。

6、标准元注解

元注解是针对注解进行标注的注解。有四种:

1)、@Documented:作用是在生成javadoc文档的时候将该Annotation也写入到文档中。

例如:

@Documented@interface DocumentedTest{    String doctest();}

在类的方法上:

/** * 这是一个@Documented的测试,说不明白,只能看例子了 */@DocumentedTest(doctest = "test")public void b2(){}

产生JavaDoc文档:

t1.Bar@DocumentedTest(doctest = "test") public void b2()这是一个@Documented的测试,说不明白,只能看例子了

2)、@Inherited 允许子类继承父类的注解。

3)、@Retention 指示注释类型的注释要保留多久。默认为 RetentionPolicy.CLASS。取值为枚举:

java.lang.annotation.RetentionPolicy:

   CLASS  编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。

   RUNTIME  编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

   SOURCE  编译器要丢弃的注释。

4)、@Target 指示注释类型所适用的程序元素的种类。如果不指定则可以用在任一程序元素上。取值为枚举的数据类型java.lang.annotation.ElementType,枚举项含义为:

   ANNOTATION_TYPE  注释类型声明

   CONSTRUCTOR  构造方法声明

   FIELD  字段声明(包括枚举常量)

   LOCAL_VARIABLE 局部变量声明

   METHOD  方法声明

   PACKAGE  包声明

   PARAMETER  参数声明

   TYPE  类、接口(包括注释类型)或枚举声明

7、注解应用举例

package t1;import java.lang.annotation.Annotation;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.reflect.Method;/** * 自定义注解 * * @author leizhimin 14-4-17 上午15:15 */@Retention(RetentionPolicy.RUNTIME)public @interface MyAnno1 {    String msg();    int value();}class Foo {    @MyAnno1(msg = "第1个方法注解", value = 111)    public void f1() throws NoSuchMethodException {    }    @MyAnno1(msg = "第2个方法注解", value = 222)    public void f2(String msg, int val) {    }    public static void main(String[] args) throws Exception {        Foo foo = new Foo();        Class
clazz = (Class
) foo.getClass(); System.out.println("----------Foo.f1()---------"); Method m1 = clazz.getMethod("f1"); m1.invoke(foo); MyAnno1 an1 = m1.getAnnotation(MyAnno1.class); System.out.println("Foo.f1()获取的注解信息:msg=" + an1.msg() + ";value=" + an1.value()); System.out.println("----------Foo.f2()---------"); Method m2 = clazz.getMethod("f2", String.class, int.class); MyAnno1 an2 = m2.getAnnotation(MyAnno1.class); System.out.println("Foo.f2()获取的注解信息:msg=" + an2.msg() + ";value=" + an2.value()); }}@Retention(RetentionPolicy.RUNTIME)@interface MyAnno2 { String what() default "";}@Documented@interface DocumentedTest{ String doctest();}@MyAnno2(what = "类多注解测试")@MyAnno1(msg = "第1个类注解", value = 999)class Bar { @MyAnno2(what = "方法多注解测试") @MyAnno1(msg = "第3个方法注解", value = 333) public void b1() { } /** * 这是一个@Documented的测试,说不明白,只能看例子了 */ @DocumentedTest(doctest = "test") public void b2(){ } public static void main(String[] args) throws Exception { Bar bar = new Bar(); bar.b2(); Class clazz = bar.getClass(); System.out.println("--------类多注解测试--------"); Annotation[] annos = clazz.getAnnotations(); for (Annotation anno : annos) { System.out.println(">>>:"+anno); if(anno instanceof MyAnno1){ System.out.println("MyAnno1类型:"+((MyAnno1) anno).msg()+";"+((MyAnno1) anno).value()); }else if(anno instanceof MyAnno2){ System.out.println("MyAnno2类型:"+((MyAnno2) anno).what()); } } System.out.println("--------方法多注解测试--------"); Method m = clazz.getMethod("b1"); Annotation[] annos_b1 = m.getAnnotations(); for (Annotation anno : annos_b1) { System.out.println(">>>:"+anno); if(anno instanceof MyAnno1){ System.out.println("MyAnno1类型:"+((MyAnno1) anno).msg()+";"+((MyAnno1) anno).value()); }else if(anno instanceof MyAnno2){ System.out.println("MyAnno2类型:"+((MyAnno2) anno).what()); } } }}

----------Foo.f1()---------Foo.f1()获取的注解信息:msg=第1个方法注解;value=111----------Foo.f2()---------Foo.f2()获取的注解信息:msg=第2个方法注解;value=222Process finished with exit code 0

--------类多注解测试-------->>>:@t1.MyAnno2(what=类多注解测试)MyAnno2类型:类多注解测试>>>:@t1.MyAnno1(msg=第1个类注解, value=999)MyAnno1类型:第1个类注解;999--------方法多注解测试-------->>>:@t1.MyAnno2(what=方法多注解测试)MyAnno2类型:方法多注解测试>>>:@t1.MyAnno1(msg=第3个方法注解, value=333)MyAnno1类型:第3个方法注解;333Process finished with exit code 0

转载地址:http://stpoo.baihongyu.com/

你可能感兴趣的文章
dom4j的生成xml并格式化输出
查看>>
企业管理过程信息化自助开发平台架构研究与应用
查看>>
TDBadgedCell
查看>>
我的友情链接
查看>>
思科路由器配置命令一览表
查看>>
《数据库系统概念》5-连接、视图和事务
查看>>
PL/SQL使用技巧收集
查看>>
skipped when looking for precompiled header
查看>>
easymybatis中字段自动填充
查看>>
java 电子商务云平台b2b b2c o2o springmvc+mybatis+spring cloud+spring boot
查看>>
如何通过ad组策略让domain users用户可以远程桌面?
查看>>
线程池的使用
查看>>
vb的winio模拟键盘鼠标部分参考代码
查看>>
等待多个并发事件完成的模型
查看>>
如何使用 PyCharm+Docker 打造深度学习利器
查看>>
十大压力测试工具,收下
查看>>
Maven学习总结(八)——使用Maven构建多模块项目
查看>>
易宝典文章——怎样管理Exchange Server 2013邮箱邮件流功能之传递选项
查看>>
Interested Transaction List ( ITL ) in Oracle
查看>>
Centos 6.3 install Darwin Streaming Server 6.0.3
查看>>