- 浏览: 103559 次
- 性别:
- 来自: 杭州
最新评论
-
whatlonelytear:
赞
java注解应用实例 - Annotation, 自定义注解, 注解类规则 -
砚台观月:
你好,例子还有吗,我想要份学习看下。提供的链接找不到了。
java网络编程之Http多线程下载应用实例 -
xianghanscce:
...
java泛型应用实例 - 自定义泛型类,方法 -
yhx1231:
...
Java反射应用实例 -
beiyeren:
写的不错啊
java注解应用实例 - Annotation, 自定义注解, 注解类规则
本文介绍了java的自定义注解及注解类编写的规则, 并通过实例来说明下如何使用java的注解. 实例演示了注解在类,构造方法,方法和字段的使用. 可以从这里下载到完成的工程代码: http://dl.iteye.com/topics/download/f74972df-234f-30c9-aadd-ca2ed1376bc2
自定义注解类编写的一些规则:
1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
2. 参数成员只能用public或默认(default)这两个访问权修饰
3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
5. 注解也可以没有定义成员, 不过这样注解就没啥用了
自定义注解类时, 可以指定目标 (类、方法、字段, 构造函数等) , 注解的生命周期(运行时,class文件或者源码中有效), 是否将注解包含在javadoc中及是否允许子类继承父类中的注解, 具体如下:
1. @Target 表示该注解目标,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
2. @Retention 表示该注解的生命周期,可选的 RetentionPolicy 参数包括
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
3. @Documented 指示将此注解包含在 javadoc 中
4. @Inherited 指示允许子类继承父类中的注解
好, 该介绍的介绍了, 看下自定义的注解应用实例:
1. 首先看下定义的注解类:
类注解定义, MyClassAnnotation.java:
默认构造方法注解定义,MyConstructorAnnotation.java:[java] view plain copy
- package com.ross.annotation;
- import java.lang.annotation.*;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-29
- * Since: MyJavaExpert v1.0
- * Description: class annotation
- */
- @Retention (RetentionPolicy.RUNTIME)
- @Target (ElementType.TYPE)
- public @interface MyClassAnnotation
- {
- String uri();
- String desc();
- }
方法注解定义,MyMethodAnnotation.java:[java] view plain copy
- package com.ross.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-29
- * Since: MyJavaExpert v1.0
- * Description: Constructor annotation
- */
- @Retention (RetentionPolicy.RUNTIME)
- @Target (ElementType.CONSTRUCTOR)
- public @interface MyConstructorAnnotation
- {
- String uri();
- String desc();
- }
字段注解定义, MyFieldAnnotation.java:[java] view plain copy
- package com.ross.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-29
- * Since: MyJavaExpert v1.0
- * Description: method annotation
- */
- @Retention (RetentionPolicy.RUNTIME)
- @Target (ElementType.METHOD)
- public @interface MyMethodAnnotation
- {
- String uri();
- String desc();
- }
2. 再看下我们注解的应用和测试:[java] view plain copy
- package com.ross.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-29
- * Since: MyJavaExpert v1.0
- * Description: field annotation
- */
- @Retention (RetentionPolicy.RUNTIME)
- @Target (ElementType.FIELD)
- public @interface MyFieldAnnotation
- {
- String uri();
- String desc();
- }
在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解, 自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.
MySample.java:
[java] view plain copy
- package com.ross.annotation;
- import java.lang.reflect.*;
- /**
- * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com
- * Date: 2012-1-29
- * Since: MyJavaExpert v1.0
- * Description: This class is used to show how to use the annotation of each level
- */
- @MyClassAnnotation (uri = "com.ross.MySample" , desc = "The class name" )
- public class MySample
- {
- @MyFieldAnnotation (uri = "com.ross.MySample#id" , desc = "The class field" )
- public String id;
- /**
- * Description: default constructor
- */
- @MyConstructorAnnotation (uri = "com.ross.MySample#MySample" , desc = "The default constuctor" )
- public MySample()
- {
- }
- /**
- * Description: normal method
- */
- @MyMethodAnnotation (uri = "com.ross.MySample#setId" , desc = "The class method" )
- public void setId(String id)
- {
- this .id = id;
- }
- /**
- * Description: MyAnnotation test
- * @throws NoSuchMethodException
- * @throws SecurityException
- * @throws NoSuchFieldException
- */
- public static void main(String[] args) throws SecurityException,
- NoSuchMethodException, NoSuchFieldException
- {
- MySample oMySample = new MySample();
- // get class annotation
- MyClassAnnotation oMyAnnotation = MySample.class
- .getAnnotation(MyClassAnnotation.class );
- System.out.println("Class's uri: " + oMyAnnotation.uri() + "; desc: "
- + oMyAnnotation.desc());
- // get constructor annotation
- Constructor oConstructor = oMySample.getClass().getConstructor();
- MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor
- .getAnnotation(MyConstructorAnnotation.class );
- System.out.println("Constructor's uri: "
- + oMyConstructorAnnotation.uri() + "; desc: "
- + oMyConstructorAnnotation.desc());
- // get method annotation
- Method oMethod = oMySample.getClass().getDeclaredMethod("setId" ,String. class );
- MyMethodAnnotation oMyMethodAnnotation = oMethod
- .getAnnotation(MyMethodAnnotation.class );
- System.out.println("Method's uri: " + oMyMethodAnnotation.uri()
- + "; desc: " + oMyMethodAnnotation.desc());
- // get field annotation
- Field oField = oMySample.getClass().getDeclaredField("id" );
- MyFieldAnnotation oMyFieldAnnotation = oField
- .getAnnotation(MyFieldAnnotation.class );
- System.out.println("Field's uri: " + oMyFieldAnnotation.uri()
- + "; desc: " + oMyFieldAnnotation.desc());
- }
- }
控制台打印结果:
[plain] view plain copy
- Class's uri: com.ross.MySample; desc: The class name
- Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor
- Method's uri: com.ross.MySample#setId; desc: The class method
- Field's uri: com.ross.MySample#id; desc: The class field
至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.
注: 转载请注明出处: http://hejiangtao.iteye.com , 用于商业得给我分成
- MyJavaExpert_V1.0-java注解应用实例.rar (10.1 KB)
- 下载次数: 250
发表评论
-
<转>NetBeans 6.1 界面语言设置
2012-10-07 01:49 2346NetBeans 6.1 界面语言设置从官网下载的NetBea ... -
常见开源协议(BSD,Apache,GPL,LGPL,MIT)
2012-10-05 01:52 988BSD开源协议(original BSD license、Fr ... -
Java相对路径总结<转>
2012-03-04 17:16 10411.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或 ... -
Java Compiler 应用实例
2012-02-09 01:22 7043一直在用JDK1.5, 一直搞不清楚JDK1.6有啥特性, 就 ... -
Java 序列化的高级认识--序列化反序列化, 加密存储<转>
2012-01-29 15:21 2304简介: 文章对序列化进行了更深一步的讨论,用实际的例子 ... -
java网络编程之Http多线程下载应用实例
2012-01-21 02:34 8685本demo 通过RandomAccessFile, URLC ... -
Java反射应用实例
2012-01-14 23:43 2137本文主要通过Java反射 ... -
java反射的性能问题 (转)
2012-01-14 23:36 2278很多IOC,还有框架都使用反射。特别是在通过反射调用方法的时候 ... -
java泛型应用实例 - 自定义泛型类,方法
2012-01-14 23:19 37489注: 转载请注明出处: http://hejiangtao.i ... -
泛型的效率和原始类的效率比较(转)
2012-01-14 23:16 1851用 了好久的泛型,突然听到有人说:泛型影响效率! 嘿, ... -
文本数据库的简单java实现
2012-01-14 22:58 7246注: 转载请注明出处: ...
相关推荐
3. **使用**: 在代码中,可以将自定义注解应用于目标元素,如: ```java public class MyClass { @MyAnnotation(value = "Hello, World!") public void myMethod() { // ... } } ``` ### 三、注解处理器 ...
Java 注解(Annotation)是自 JDK 5.0 版本引入的一种元数据机制,用于向编译器、开发工具和运行时系统提供有关代码的附加信息。它们并不直接影响程序的执行,但可以用于代码分析、编译时验证或者运行时处理。本文将...
**Chart.js插件-Annotation详解** 在前端开发中,数据可视化是至关重要的,它能够将复杂的数据以图形的形式展示,使用户更容易理解。Chart.js是一个轻量级且强大的JavaScript库,用于创建各种图表,如折线图、柱状...
Annotation注解可以直接应用在类和类的属性上,减少了额外的配置文件需求,提升了开发效率。 1. **实体类注解@Entity** `@Entity` 注解标记一个Java类为Hibernate管理的实体类,表示这个类将映射到数据库的一个表...
### Java 注解Annotation实例上手文档 #### 一、引言与基础知识 Java注解(Annotation)自JDK 5.0引入以来,已经成为Java语言的重要特性之一,它为代码元数据提供了一种标准化的方式,使得编译器、工具和其他框架...
@Target(ElementType.TYPE) // 表示该注解应用于类 @Retention(RetentionPolicy.RUNTIME) // 表示该注解在运行时可见 public @interface MyComponent { String value() default ""; // 可选的默认值 } ``` 接下来...
3. **Hibernate Annotation**: Hibernate的注解是在Java类和属性上添加元数据的方式,它替代了传统的Hibernate XML配置文件。通过注解,可以在实体类和属性上直接定义数据库映射,如@Entity表示一个数据库表,@Table...
在这个例子中,我们通过`isAnnotationPresent`方法检查`Product`类上是否存在`SoldOut`注解,如果存在,则通过`getAnnotation`获取注解实例并读取其属性。 自定义注解还可以与处理器(Annotation Processor)结合,...
本压缩包“spring-boot-annotation-spel.zip”显然是关于如何在自定义注解中运用SPEL表达式的实例教程。 SPEL是Spring框架提供的一种强大的表达式语言,用于在运行时查询和操作对象图。它允许我们执行各种操作,如...
- `getAnnotation` 方法用于获取应用到类或方法上的自定义注解实例。 - 反射机制用于在运行时获取注解信息并打印出来。 ### Java 注解的应用场景 Java 注解在实际开发中有多种用途,以下是一些常见的应用场景: 1...
而在注解驱动开发中,我们可以通过在类上使用@Component(或其子注解@Service、@Repository、@Controller)来标记一个类为Spring管理的组件。例如: ```java @Service public class UserService { // ... } ``` ...
在Nutz中,任何类都可以成为一个Bean,只要它被`@org.nutz.ioc.annotation.Injectable`注解或者包含在某个包下,该包已被配置为扫描范围。Bean的生命周期和作用域可以通过`@org.nutz.ioc.annotation.Inject`的`value...
这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...
本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...
描述中提到的“自定义注解生成单例工厂的实例”意味着开发者可能已经创建了一个注解,当应用到类上时,该注解会自动将这个类转换为一个单例模式的工厂。这通常涉及到装饰器(Decorator)的概念,装饰器是TypeScript...
在应用启动时,Spring Boot会自动发现mybatis-spring-boot-starter依赖,并配置好SqlSessionFactory和MapperScannerConfigurer,这样我们无需编写大量配置文件,只需在Java类上添加注解即可。 在多数据源的实现中,...
接下来,我们可以将这个自定义注解应用到方法上,以指示该方法的返回结果: ```java public class Service { @Result(message = "获取用户信息成功", code = 200) public User getUserInfo(String userId) { //...
这些注解可以将Java类直接转换为UIMA分析引擎,减少了代码和XML配置之间的映射工作。 3. **组件定义**:在UIMAFIT中,可以使用`@TypeSystem`注解来指定组件使用的类型系统,这包括所有的注解类型。`@...
可以通过`AnnotatedElement`接口的`getAnnotation`方法获取注解实例,然后访问其元素。 其次,设计模式是面向对象设计中的一种最佳实践,是对常见问题的解决方案。它们是经过时间考验,被广泛接受并多次成功应用的...
- 在`src`目录下的Java类中,你可能会看到如`@Action`、`@Result`等注解的实例,它们指示Struts2如何处理特定的HTTP请求和响应。 - `WebContent`目录下的资源文件(如JSP、HTML)和静态内容会被服务器直接发送给...