`
wjjbfq
  • 浏览: 80243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Annotation注解 总结

阅读更多

       annotation(注解)并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。annotation可以从源文件、class文件或者以在运行时反射的多种方式被读取。
      JDK5内建的annotation 有@Override @Deprecated @SuppressWarnings

       @Override 当子类重写父类的方法时,在子类的方法上面加上此注释,可以检查重写的方法是否正确。

       @Deprecated 标示此方法已经过时。

       @SuppressWarnings 将警告忽略。@SuppressWarnings({"unchecked","deprecation"})

       

例如:Map map = new Map();会出现警告,应为没有应用泛型,
正确的为Map<?,?> map = new Map<?,?>();此方法前加上@SuppressWarnings("unchecked")警告会消失。

  

自定义annotation

使用@interface自行定义Annotation型态时,实际上是自动继承了java.lang.annotation.Annotation接口
由编译程序自动为您完成其它产生的细节

 

1、创建一个自定义的annotation名为MyAnnotation

public @interface MyAnnotation
{
	String hello() default "wangjie";
	String world();
}

    annotation 方法中默认为 String value(); 如果为默认属性时,可以使用@MyAnnotation("XXX") 否则得使用@MyAnnotation(hello="XXX",world="XXX") .hello的值将覆盖default中的值"wangjie".另外hello()有默认值所以@MyAnnotation(world="XXX")也是正确的。

2、创建一个测试类

//annotation 可以放在类、方法、属性前面。
@MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest
{
	@MyAnnotation(hello = "beijing", world = "shanghai")
	public void output()
	{
		System.out.println("output something");
	}
}

 2.1 这样就完成了注释的编写。注释会在程序代码、编译、运行时都会保留吗?这还需要自己来设定。

        java.lang.annotation.Retention型态可以在您定义Annotation型态时,指示编译程序该如何对待您的自定义的    Annotation型态
         预设上编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息
         在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态
package java.lang.annotation;
public enum RetentionPolicy
 {
     SOURCE, //编译程序处理完Annotation信息后就完成任务
     CLASS,  //编译程序将Annotation储存于class档中,缺省
     RUNTIME //编译程序将Annotation储存于class檔中,可由VM读入
}

所以要指示annotation可以保留在何种方式中,需要用到:@Retention(XXX) xxx为RetentionPolicy.RUNTIME 或

RetentionPolicy.SOURCE 默认为RetentionPolicy.CLASS

 

例如将上面可以MyAnnotation修改为

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
	String hello() default "wangjie";
	String world();
}

 这样在程序运行时就可以调用MyAnnotation 中的值了。调用采用反射。

例如:

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class MyReflection
{
	public static void main(String[] args) throws Exception
	{
		MyTest myTest = new MyTest();
		
		Class<MyTest> c = MyTest.class;
		
		Method method = c.getMethod("output",new Class[]{});
		
		if(method.isAnnotationPresent(MyAnnotation.class))
		{
			MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
			
			String hello = myAnnotation.hello();
			String world = myAnnotation.world();
			
			System.out.println(hello);
			System.out.println(world);
			
		}
		//打印出方法上面所使用的所以annotation的类型名称。 
		Annotation[] annotations = method.getAnnotations();
		
		for(Annotation annotation : annotations)
		{
			System.out.println(annotation.annotationType().getName());
		}
		
	}
}	

 结果为:

beijing
shanghai
com.langsin.annotation.MyAnnotation

 2.2 如果要限定annotation放置的位置 可以使用@Target()

例如

@Target(ElementType.METHOD)  //这里加入了,则表示MyAnnotation只能放在方法的前面。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
	String hello() default "langsin";
	String world();
}

 Target的参数有:

package java.lang.annotation;
public enum ElementType 
{
     TYPE, //适用class, interface, enum
     FIELD, //适用field
     METHOD, //适用method
     PARAMETER, //适用method上之parameter
     CONSTRUCTOR, //适用constructor
     LOCAL_VARIABLE, //适用局部变量
     ANNOTATION_TYPE, //适用annotation型态
     PACKAGE //适用package
}

 2.3 如果一个父类加入了@MyAnnotation() 他的子类也想继承父类的这个注释。则在MyAnnotation中需要加入@Inherited()  这样在子类中才能得到这个注释的内容。(运用反射)。

 

@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation
{
	String hello() default "wangjie";
	String world();
}

 

 2.4 想要在使用者制作JavaDoc文件的同时,也一并将Annotation的讯息加入至API文件中
使用java.lang.annotation.Documented

即在annotation  前加入@Documented

例如:

@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation
{
	String hello() default "wangjie";
	String world();
}

 

分享到:
评论

相关推荐

    Hibernate Annotation 笔记 总结 注解

    Hibernate Annotation 笔记 总结 注解 注解事务,声明事务,详解。

    mybatis学习总结:annotation与xml结合示例

    NULL 博文链接:https://shmilyaw-hotmail-com.iteye.com/blog/2359096

    Java Annotation注解相关原理代码总结

    主要介绍了Java Annotation注解相关原理代码总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring总结(四)

    Spring个人总结,基于Annotation注解的方式开发,配置

    注释类型总结

    tapestry Annotation Types Summary注释类型总结

    Android AOP注解Annotation详解(一)

    Android 注解Annotation 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) Android AOP 等在Android上应用越来越广泛,例如框架...

    Hibernate注解.docx

    在Hibernate中使用注解,主要是为了替代映射文件,完成“类到表,属性到字段”的映射。 JPA提供了一套功能强大的注解。...注解的具体文档在javax.persistence包下的注解类型总结Annotation Type Summry中。

    Hibernate 注解(总结).docx

    解析:来源:Hibernate提供了Hibernate Annotations扩展包,它可以替换复杂的hbm.xml文件( Annotations扩展包是hibernate-annotation-3.4.0GA.zip) 作用:使得Hibernate程序的开发大大的简化。利用注解后,可不用...

    uMVVM-Annotation:对开源框架uMVVM的注解

    这里是对 @木宛城主 大大的Unity MVVM UI框架uMVVM的我的一些注解~~ 该开源框架地址如下: 方便更好的理解一下这个框架的实现步骤~ 简单概括 下面是对uMVVM框架的运行机制简单概括 View-视图类的运行过程总结 View类...

    java高级特性,涵盖了多种java常用的一些例子

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节...

    由浅入深 带你了解Java注解

    除此之外,我还总结学习注解的3大好处:  1、能够读懂别人写的代码,特别是框架相关的代码;  2、让编程更加简洁,代码更加清晰;  3、让别人高看一眼,装逼利器;  说完了这些,下面开始真干货了。  注解...

    J2SE技术总结-Java学习精华教程-电子书

    注解(Annotation) ..........概述 ..........注解的定义/使用/解析 .....I/O_体系 ..........认识IO ..........Java中的IO .....I/O_BIO ..........I/O流对象与使用 ..........文件相关类的使用 .....集合 ............

    jdk-study:jdk原始码学习,包含jdk1.7&1.8&1.9的原始码,会以注释的形式添加自己的理解

    JDK原始码【1.9】,预设系统,JShell,集合工厂方法等学习设计模式过程中总结的jdk中相关的设计模式结构(结构模式)适配器:把一个接口或类变成另外一种。 * java.util.Arrays#asList()* javax.swing.JTable...

    单元测试利器JUnit4

    本文假设读者对Eclipse下进行Java开发有一定的经验,并了解Java5中的注解(annotation)特性。 引言毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的...

    Struts2入门教程(全新完整版)

    10.使用0配置:ZERO Annotation 15 11.Result配置详解 15 探讨type类型: 16 Type类型值 16 作用说明 16 对应类 16 chain 16 用来处理Action链 16 com.opensymphony.xwork2.ActionChainResult 16 dispatcher 16 用来...

    java7源码-spring_test:弹簧测试

    这个大概的意思就是识别注解 4.4 最后需要配置一个视图解析器 InternalResourceViewResolver 详情查看这个文件夹 还有一个就是applicationContext.xml文件 这个在这个项目没有用到 小小总结一下 就是 你需要知道有...

    安卓java读取网页源码-OuNews:欧报

    Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroid的EventBus实现 深入浅出RxJava 五、声明 应用中展示的所有内容均搜集自互联

    安卓java读取网页源码-XWLNews:周四暑期学校的Android新闻应用

    安卓java读取网页源码 XWLNews 简单的新闻客户端 零、项目性质 ...Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroid的Even

    Spring.3.x企业应用开发实战(完整版).part2

    7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()和@args() 7.5.4 within() 7.5.5 @within()和@target() 7.5.6 target()的this() 7.6 @AspectJ进阶 7.6.1 切点复合运算 7.6.2 命名切点 7.6.3 ...

Global site tag (gtag.js) - Google Analytics