- 浏览: 324391 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (254)
- java (178)
- tomcat (6)
- 邮件 (1)
- smtp (1)
- Linux (2)
- 编码 (2)
- 导入工程 (1)
- Specification Level (1)
- hibernate (10)
- 字段类型 (1)
- 字段类型匹配 (1)
- 数据库 (3)
- sql (9)
- struts2 (8)
- 类型转换 (2)
- java,MyEclipse,SVN (1)
- Myecplise (4)
- 输入校验 (1)
- JFrame (2)
- Oracle (8)
- google (1)
- Swing (3)
- Fusioncharts (1)
- 找工作 (0)
- js (4)
- jsp (11)
- displaytag (1)
- spring (8)
- 工作 (1)
- String (1)
- 算法 (2)
- IO (1)
- xml (3)
- 设计模式 (1)
- UML (1)
- 文档 (1)
- ajax (1)
- 日常 (7)
- sql server (1)
- mysql (3)
- git (1)
- Maven (1)
- mongodb (1)
- postman (1)
最新评论
从Java 5.0版发布以来,5.0平台提供了一个正式的annotation功能:允许开发者定义、使用自己的annotation类型。此功能由一个定义annotation类型的语法和一个描述annotation声明的语法,读取annotation的API,一个使用annotation修饰的class文件,一个annotation处理工具(apt)组成。
在实际开发中,其实“注解”和“xm配置文件”是一个问题的两种解决手段,本质上是一回事,你掌握了配置文件来完成项目也行,掌握了注解来完成项目也行,具体使用哪种方式是根据项目统一要求的,公司的不同要求使用的方式也不同。
Annotation并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。Annotation可以从源文件、class文件或者以在运行时反射的多种方式被读取。
注解可以用在类、方法、成员变量、方法的参数、方法的局部变量上面,任何地方都可以使用注解。
自定义注解的方式:
Myecplise里面新建一个Annotation,你会发现它的类型是@interface,如果自定义的注解类里面什么都没有的话,比如在某个类上面使用这个注解的时候也就相应的什么都不用做,直接在类的上面写上@开头的注解名称即可;而如果在注解类里面为其增加一个属性比如String value();,然后在某个类上面使用此注解的时候也必须相应的为此属性赋值。赋值方式下面会讲到。
1. Java注解(Annotation):
a) Override注解表示子类要重写(override)父类的对应方法。
b) Deprecated注解表示方法是不建议被使用的。
c) SuppressWarnings注解表示抑制警告。
2. 自定义注解:当注解中的属性名为value 时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
3. 当我们使用@interface关键字定义一个注解时,该注解隐含地继承了
java.lang.annotation.Annotation 接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解(我们所定义的接口依然是接口类型而不是注解类型。);Annotation本身是接口而不是注解(Annotation本身是接口类型而不是注解类型。)。可以与Enum类比。
对每一个注解来说,我们都可以为其设定一个默认值,例如:
Public @interface AnnotationTest {
String value() default “hello”;
}
里面的@interface是一个整体,是一个类型,和class是一个级别。
Value成员设定默认值,用“default”关键词
使用@interface自行定义Annotation型态时,实际上是自动继承了java.lang.annotation.Annotation接口,由编译程序自动为您完成其它产生的细节。
在定义Annotation型态时,不能继承其它的Annotation型态或是接口。
Java.lang.Annotation接口说明:它是一个公用的接口,被所有的annotation类型所继承,我们手动的去继承这个接口并不意味着我们会定义一个annotation类型(一个注解类),要想定义注解只能通过“@interface”这个关键字来定义。这个接口本身并没有定义annotation类型,换句话说这个接口本身还是一个接口,它并不是说注解继承了它,那它(Annotation)也成了注解了,它本身不是注解,而是接口,当定义一个注解的时候自动的就继承了它,但是当我们手工的去定义一个接口并且让这个接口去继承Annotation,那我们自己定义那个接口它还是接口,不会变成注解。
定义Annotation型态时也可以使用包来管理类别。
方式类同于类的导入功能。
下面进入注解的核心内容讲解:
Retention注解类型,里面有一个value属性。
Java.lang.annotatino.Retention型态可以在您定义Annotation(枚举)型态时,指示编译程序该如何对待您的自定义Annotation型态度。
缺省(默认)情况编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息。
在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态
Package java.lang.annotation;
Public enum RetentionPolicy {
SOURCE,//编译程序处理完Annotation信息后就完成任务,这种情况下注解会被编译器所忽略掉,编译器就不会把它编译到.class文件当中,这时注解只会存在于源文件当中。
CLASS,//编译程序将Annotation(注解)储存于class文件中,不能在运行期被虚拟机所获取到,缺省(默认)
RUNTIME//编译程序将Annotation储存于class当中,并且在运行期可由JVM(java虚拟机)获取到,并可供java反射读入
}
注:RUNTIME和CLASS唯一的区别就在于是不是能由JVM(java虚拟机)在运行期通过反射的方式获取到注解。
Retention注解类里面有一个属性value,value类型就是RetentionPolicy的,是一个枚举类型的,这个枚举决定了Retention这个注解应该如何的去保持,能保持多长时间,访问权限是什么样的等等。默认情况下这个Retention注解信息会被保存到class文件中(value ==RetentionPolicy.CLASS )。
注解是可以修饰注解的,例如:
@Retention(value=SOURCE)
Public @interface SuppressWarnings
这个代码说明SuppressWarnings这个注解它应该就存在于源文件当中,不会被编译到class文件当中,更不会被JVM所读取到。
一个方法可以被多个注解所修饰。一个注解同样的也可以被多个注解所修饰。
RetentionPolicy为SOURCE的例子是@SuppressWarnings
仅在编译时期告知编译程序来抑制警告,所以不必将这个信息储存于.class档案。
RetentionPolicy为RUNTIME的时机,可以像是您使用Java设计一个程序代码分析工具,您必须让JVM能读出Annotation(注释)信息,以便在分析程序时使用。
搭配反射(Reflection)机制,就可以达到这个目的。
下面是利用注解提供的一些反射API来在运行期间(@Retention(value= RUNTIME)
)根据获得的注解信息来做一些其他的操作:
告知编译程序如何处理@ Retention:
Java.lang.reflect.AnnotatedElement接口;
Public Annotation getAnnotation(Class annotationType);
Public Annotation[] getAnnotations();
Public Boolean isAnnotationPresent(Class annotationType);
Class、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口。
要想在反射中能读取Annotation(注解),定义Annotation时必须设定RetentionPolicy为RUNTIME,而就是可以在JVM中读取Annotation信息。
下面是一个反射操作注解的例子(重点掌握此例,注解的最核心内容):
限定annotation使用对象@Target
使用java.lang.annotation.Target可以定义其使用之时机。来规定由它来修饰的那个自定义的注解的使用时机,就是什么时候能用那个自定义的注解。
在定义时要指定java.lang.annotation.ElementType的枚举之一。
Target和Retention有异曲同工之处,Retention要搭配一个枚举RetentionPolicy,而Target也要搭配一个枚举ElementType。
@Target注解主要用于:我们自己定义了一个注解,这个注解修饰方法也可以,修饰类也可以,修饰成员变量也可以,修饰方法的参数也可以,修饰局部变量也可以,修饰什么都行,没有什么限制,但是实际开发里面某些注解只能让它修饰类,某些注解只能让它修饰方法,这样的话我们就应该给它限定一个目标,这个注解到底是干嘛用的,它的使用范围是什么,那么,这个@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
}
下面这个例子里面的自定义注解MyTarget就只能用在方法上,比如用在类上面就会报错:
子类是否继承父类@Inherited
默认情况下父类别中的Annotation并不会被继承至子类别中:
如果想要让其被继承,可以在定义Annotation型态时加上java.lang.annotation.Inherited型态的Annotation。
在实际开发中,其实“注解”和“xm配置文件”是一个问题的两种解决手段,本质上是一回事,你掌握了配置文件来完成项目也行,掌握了注解来完成项目也行,具体使用哪种方式是根据项目统一要求的,公司的不同要求使用的方式也不同。
Annotation并不直接影响代码语义,但是它能够工作的方式被看作类似程序的工具或者类库,它会反过来对正在运行的程序语义有所影响。Annotation可以从源文件、class文件或者以在运行时反射的多种方式被读取。
注解可以用在类、方法、成员变量、方法的参数、方法的局部变量上面,任何地方都可以使用注解。
自定义注解的方式:
Myecplise里面新建一个Annotation,你会发现它的类型是@interface,如果自定义的注解类里面什么都没有的话,比如在某个类上面使用这个注解的时候也就相应的什么都不用做,直接在类的上面写上@开头的注解名称即可;而如果在注解类里面为其增加一个属性比如String value();,然后在某个类上面使用此注解的时候也必须相应的为此属性赋值。赋值方式下面会讲到。
1. Java注解(Annotation):
a) Override注解表示子类要重写(override)父类的对应方法。
b) Deprecated注解表示方法是不建议被使用的。
c) SuppressWarnings注解表示抑制警告。
2. 自定义注解:当注解中的属性名为value 时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
3. 当我们使用@interface关键字定义一个注解时,该注解隐含地继承了
java.lang.annotation.Annotation 接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解(我们所定义的接口依然是接口类型而不是注解类型。);Annotation本身是接口而不是注解(Annotation本身是接口类型而不是注解类型。)。可以与Enum类比。
对每一个注解来说,我们都可以为其设定一个默认值,例如:
Public @interface AnnotationTest {
String value() default “hello”;
}
里面的@interface是一个整体,是一个类型,和class是一个级别。
Value成员设定默认值,用“default”关键词
使用@interface自行定义Annotation型态时,实际上是自动继承了java.lang.annotation.Annotation接口,由编译程序自动为您完成其它产生的细节。
在定义Annotation型态时,不能继承其它的Annotation型态或是接口。
Java.lang.Annotation接口说明:它是一个公用的接口,被所有的annotation类型所继承,我们手动的去继承这个接口并不意味着我们会定义一个annotation类型(一个注解类),要想定义注解只能通过“@interface”这个关键字来定义。这个接口本身并没有定义annotation类型,换句话说这个接口本身还是一个接口,它并不是说注解继承了它,那它(Annotation)也成了注解了,它本身不是注解,而是接口,当定义一个注解的时候自动的就继承了它,但是当我们手工的去定义一个接口并且让这个接口去继承Annotation,那我们自己定义那个接口它还是接口,不会变成注解。
定义Annotation型态时也可以使用包来管理类别。
方式类同于类的导入功能。
下面进入注解的核心内容讲解:
Retention注解类型,里面有一个value属性。
Java.lang.annotatino.Retention型态可以在您定义Annotation(枚举)型态时,指示编译程序该如何对待您的自定义Annotation型态度。
缺省(默认)情况编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,而仅用于编译程序或工具程序运行时提供信息。
在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态
Package java.lang.annotation;
Public enum RetentionPolicy {
SOURCE,//编译程序处理完Annotation信息后就完成任务,这种情况下注解会被编译器所忽略掉,编译器就不会把它编译到.class文件当中,这时注解只会存在于源文件当中。
CLASS,//编译程序将Annotation(注解)储存于class文件中,不能在运行期被虚拟机所获取到,缺省(默认)
RUNTIME//编译程序将Annotation储存于class当中,并且在运行期可由JVM(java虚拟机)获取到,并可供java反射读入
}
注:RUNTIME和CLASS唯一的区别就在于是不是能由JVM(java虚拟机)在运行期通过反射的方式获取到注解。
Retention注解类里面有一个属性value,value类型就是RetentionPolicy的,是一个枚举类型的,这个枚举决定了Retention这个注解应该如何的去保持,能保持多长时间,访问权限是什么样的等等。默认情况下这个Retention注解信息会被保存到class文件中(value ==RetentionPolicy.CLASS )。
注解是可以修饰注解的,例如:
@Retention(value=SOURCE)
Public @interface SuppressWarnings
这个代码说明SuppressWarnings这个注解它应该就存在于源文件当中,不会被编译到class文件当中,更不会被JVM所读取到。
一个方法可以被多个注解所修饰。一个注解同样的也可以被多个注解所修饰。
RetentionPolicy为SOURCE的例子是@SuppressWarnings
仅在编译时期告知编译程序来抑制警告,所以不必将这个信息储存于.class档案。
RetentionPolicy为RUNTIME的时机,可以像是您使用Java设计一个程序代码分析工具,您必须让JVM能读出Annotation(注释)信息,以便在分析程序时使用。
搭配反射(Reflection)机制,就可以达到这个目的。
下面是利用注解提供的一些反射API来在运行期间(@Retention(value= RUNTIME)
)根据获得的注解信息来做一些其他的操作:
告知编译程序如何处理@ Retention:
Java.lang.reflect.AnnotatedElement接口;
Public Annotation getAnnotation(Class annotationType);
Public Annotation[] getAnnotations();
Public Boolean isAnnotationPresent(Class annotationType);
Class、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口。
要想在反射中能读取Annotation(注解),定义Annotation时必须设定RetentionPolicy为RUNTIME,而就是可以在JVM中读取Annotation信息。
下面是一个反射操作注解的例子(重点掌握此例,注解的最核心内容):
package com.shengshiyuan.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String hello() default "shengshiyuan"; String world(); }
package com.shengshiyuan.annotation; @MyAnnotation(hello = "beijing", world = "shanghai") public class MyTest { @MyAnnotation(hello = "tianjing", world = "shangdi") @Deprecated @SuppressWarnings("unchecked") public void output() { System.out.println("output something!"); } }
package com.shengshiyuan.annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Method; /** * 通过反射方式读取MyTest类上面所修饰的注解信息,把这些信息都获取过来 * 类: MyReflection <br> * 描述: TODO <br> * 作者: * 时间: Oct 29, 2013 10:48:32 AM */ public class MyReflection { public static void main(String[] args) throws Exception { MyTest myTest = new MyTest(); Class<MyTest> c = MyTest.class; // 获得output方法对应的Method对象 Method method = c.getMethod("output", new Class[] {}); // 判断此方法上面是不是被MyAnnotation注解所修饰 if (method.isAnnotationPresent(MyAnnotation.class)) { // 调用output方法 method.invoke(myTest, new Object[] {}); // 获得output方法(method就表示output方法)上面修饰它的MyAnnotation注解 MyAnnotation myAnnotation = method .getAnnotation(MyAnnotation.class); // 获得myAnnotation注解里面的hellow和world属性值 String hello = myAnnotation.hello(); String world = myAnnotation.world(); System.out.println(hello + "," + world); } // 获得所有修饰output方法的注解组成的数组 Annotation[] annotations = method.getAnnotations(); // 遍历该数组(这里能访问并打印出来的肯定都是@Retention(value=SOURCE)类型的注解,因为其他类型的注解通过反射是访问不到的,因此这里只会打印出MyAnnotation和Deprecated两个注解,而SuppressWarnings却不会被打印出来) for (Annotation annotation : annotations) { // annotation.annotationType()是获得注解类型 System.out.println(annotation.annotationType().getName()); } } }
限定annotation使用对象@Target
使用java.lang.annotation.Target可以定义其使用之时机。来规定由它来修饰的那个自定义的注解的使用时机,就是什么时候能用那个自定义的注解。
在定义时要指定java.lang.annotation.ElementType的枚举之一。
Target和Retention有异曲同工之处,Retention要搭配一个枚举RetentionPolicy,而Target也要搭配一个枚举ElementType。
@Target注解主要用于:我们自己定义了一个注解,这个注解修饰方法也可以,修饰类也可以,修饰成员变量也可以,修饰方法的参数也可以,修饰局部变量也可以,修饰什么都行,没有什么限制,但是实际开发里面某些注解只能让它修饰类,某些注解只能让它修饰方法,这样的话我们就应该给它限定一个目标,这个注解到底是干嘛用的,它的使用范围是什么,那么,这个@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
}
下面这个例子里面的自定义注解MyTarget就只能用在方法上,比如用在类上面就会报错:
package com.shengshiyuan.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface MyTarget { String value(); }
package com.shengshiyuan.annotation; public class MyTargetTest { @MyTarget("hello") public void doSomething() { System.out.println("hello world"); } }
子类是否继承父类@Inherited
默认情况下父类别中的Annotation并不会被继承至子类别中:
如果想要让其被继承,可以在定义Annotation型态时加上java.lang.annotation.Inherited型态的Annotation。
发表评论
-
领域精通涉及技术点(不分先后)
2017-12-20 19:35 620Java8 netty jvm kafaka消息队列 上传下载 ... -
计算机各种单位讲解及换算
2017-12-13 13:54 1642我还听过有UK的 一、最小单位:位(bit,缩写为b) 在原 ... -
JAVA字符串格式化-String.format()和MessageFormat的使用
2017-12-05 10:39 1447String.format()常规类型的格式化 Stri ... -
eclipse启动项目常见问题
2017-11-16 17:46 1184今儿遇到了个问题,ecli ... -
字符编码笔记:ASCII,Unicode和UTF-8
2017-10-23 16:37 458讲的太牛逼了: http://ww ... -
emoji简单讲解
2017-10-23 15:17 973emoji处理方式大起底 http://blog.csdn.n ... -
BigDecimal讲解
2017-10-12 15:58 445BigDecimal 由任意精度的整数非标度值 和 32 位的 ... -
eclips 控制台console上不打印信息
2017-09-06 21:53 5811、进windows菜单 -> show view -& ... -
详解RequestMappingHandlerMapping和RequestMappingHandlerAdapter
2017-08-29 17:08 2981http://donald-draper.iteye.com/ ... -
用@ExceptionHandler 来进行切面异常处理
2017-08-29 11:47 2311有时候我们想处理某个类里Controller中抛出的异常怎么搞 ... -
Spring 注解@Component、@Repository、@Service、@Controller区别
2017-08-28 15:27 1017spring 2.5 中除了提供 @Com ... -
线程的一点小总结
2017-08-23 20:36 709java中main方法启动的是一个进程还是一个线程? 答:是一 ... -
线程池
2017-08-23 17:35 522诸如Web 服务器、数据库 ... -
Class源码大概讲解
2017-08-23 16:47 512http://blog.csdn.net/a327369238 ... -
Spring 事务相关
2017-08-14 12:10 476Transactionz注解的readOnly ... -
把时间当做朋友-前言
2017-08-13 20:47 407要管理的不是时间,而是自己。人们生活在同一个世界,却又各自 ... -
单例里面的方法讲解
2017-08-11 14:55 490spring里的controller是单例的。系统针对每个co ... -
eclipse拷贝出来的项目名称还是原来的
2017-07-26 16:46 1082需要修改的有如下几个地方: 1、pom.xml里面打包的名字一 ... -
自定义hibernate方言,新增自定义函数
2017-06-27 10:47 880按位与运算(&)在许多数据库中都是支持的,遗憾的是,H ... -
http请求参数:header body paramter三种参数区别、联系
2017-06-19 10:46 489112345
相关推荐
Java注解Annotation用起来很方便,也越来越流行,由于其简单、简练且易于使用等特点,很多开发工具都提供了注解功能,不好的地方就是代码入侵比较严重,所以使用的时候要有一定的选择性。 这篇文章将利用注解,来做...
总结,Java注解是一种强大的工具,能够简化代码,提供元数据,增强代码的可读性和可维护性。结合反射机制,我们可以利用注解实现许多灵活的编程模式,如自动化配置、动态代理等。了解并熟练运用注解,是提升Java开发...
### Java 注解Annotation实例上手文档 #### 一、引言与基础知识 Java注解(Annotation)自JDK 5.0引入以来,已经成为Java语言的重要特性之一,它为代码元数据提供了一种标准化的方式,使得编译器、工具和其他框架...
总结,Java注解是一种强大的工具,它增强了代码的可读性,简化了配置,并且通过元数据提供了额外的信息层,使得开发过程更加灵活和高效。在实际开发中,理解并熟练运用注解对于提升代码质量和开发效率具有重要意义。
### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...
Java 注解(Annotation) - 请认准 ih0qtq
Java Annotation注解技术是自Java SE 5.0版本引入的一种元编程机制,它允许程序员在源代码的各个层面(如类、方法、变量等)添加元数据,以供编译器、JVM或第三方工具在编译时或运行时进行处理。Annotation简化了...
Java注解,也称为Annotation,是Java编程语言中的一种特性,用于向编译器、JVM或工具提供元数据。元数据是关于数据的数据,它提供了额外的信息,但不直接影响程序的执行。注解在代码中以`@注解名`的形式出现,主要...
如果你想知道java annotation是什么?你可以看看
Java.Annotation注解.part4
本文将详细介绍Java注解的作用、应用场景以及如何自定义注解。 Java注解是一种强大的工具,它们为代码提供了额外的元数据,可以在编译时和运行时发挥多种作用。通过自定义注解,开发者可以创建灵活的框架和库,提高...
在实际开发中,Java注解被广泛用于Spring框架的依赖注入、JPA的实体映射、JSF的UI组件绑定等场景,极大地提高了代码的可维护性和灵活性。然而,对于更复杂的注解使用,如自定义注解生成XML映射文件,需要更深入的...
Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...
Java.Annotation注解.part3
Java.Annotation注解.part2
Java.Annotation注解.part1