注解(Annotation) 为我们在代码中天界信息提供了一种形式化的方法,是我们可以在稍后
某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据)。
现在我们开始研究怎么使用自定义注解,从而了解注解是怎么工作的。
定义一个注解 MyAnnotationClassDefinition.java
package org.lsy.test.little;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotationClassDefinition {
public String classExplanation();
public String classEessage();
//也可以给一个默认值,如下
//public String classExplanation() default "";
}
要注意的是注解定义的形式是@interface,它本身也需要注解,而且是不可缺少的。
其中主要的2个是:@Target , @Retention
作用是;
@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
还有
@Documented 将此注解包含在 javadoc 中
@Inherited 允许子类继承父类中的注解
上面的注解只能用在类上面,
我们再定义一个可以用在方法上的。
MyAnnotationDefinition,java
package org.lsy.test.little;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotationDefinition {
public String explanation();
public String message();
}
写一个很普通的类:OneClass.java
注意,要使用注解
package org.lsy.test.little;
@MyAnnotationClassDefinition(classExplanation="我是类OneClass的classExplanation",classEessage="我是类OneClass的classEessage")
public class OneClass {
@MyAnnotationDefinition(explanation="我是方法printMyMessageOne的explanation",
message="我是方法printMyMessageOne的message")
public void printMyMessageOne(){
}
@MyAnnotationDefinition(explanation="我是方法printMyMessageTwo的explanation",
message="我是方法printMyMessageTwo的message")
public void printMyMessageTwo(){
}
}
再写一个main函数运行一下,看看效果
package org.lsy.test.little;
import java.lang.annotation.*;
import java.lang.reflect.Method;
public class MyAnnotationTest {
public static void main(String[] args) {
OneClass one=new OneClass();
if(OneClass.class.isAnnotationPresent(MyAnnotationClassDefinition.class)){
MyAnnotationClassDefinition myAnnotationClassDefinition=
(MyAnnotationClassDefinition)OneClass.class.getAnnotation(MyAnnotationClassDefinition.class);
System.out.println("类OneClass使用注解MyAnnotationClassDefinition,其属性classExplanation是:"
+myAnnotationClassDefinition.classExplanation());
System.out.println("类OneClass使用注解MyAnnotationClassDefinition,其属性classEessage是:"
+myAnnotationClassDefinition.classEessage());
}else{
System.out.println("类OneClass没有注解MyAnnotationDefinition");
}
//
Method[] methods = OneClass.class.getDeclaredMethods();
for (Method method : methods) {
// 判断方法中是否有指定注解类型的注解
boolean hasAnnotation = method.isAnnotationPresent(MyAnnotationDefinition.class);
if (hasAnnotation) {
//根据注解类型返回方法的指定类型注解
MyAnnotationDefinition myannotation = method.getAnnotation(MyAnnotationDefinition.class);
System.out.println("MyAnnotationDefinition( explanation = "+
myannotation.explanation() + " , message = "
+ myannotation.message() + " )");
}
}
}
}
控制台打印:
类OneClass使用注解MyAnnotationClassDefinition,其属性classExplanation是:我是类OneClass的classExplanation
类OneClass使用注解MyAnnotationClassDefinition,其属性classEessage是:我是类OneClass的classEessage
MyAnnotationDefinition( explanation = 我是方法printMyMessageOne的explanation , message = 我是方法printMyMessageOne的message )
MyAnnotationDefinition( explanation = 我是方法printMyMessageTwo的explanation , message = 我是方法printMyMessageTwo的message )
由此,我们可以想到spring使用注解的原理也不外乎如此。
它先读取你的注解,然后根据读取的值去xml中寻找。
如果找到了就实例化一个对象返回。这样据实现了注入的效果。
分享到:
相关推荐
包括Java自定义注解以及包括自定义注解的应用实例。以及注解相关知识的注解
Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
Java手机游戏大富翁源代码+注释.rar Java手机短信项目源码.rar Java扫雷源码.rar Java生成自定义控件源代码.rar Java调色板面板源代码.rar Java跳棋(基于SWT).rar Java通讯录手机版源码.rar Java鼠标拖拽功能.rar ...
Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...
Java圆形按钮实例代码,含注释 Java圆形电子时钟源代码 Java多用户聊天室程序(毕业设计).rar Java大型CERP进销存系统.rar Java存储与读取对象.rar Java局域网通信——飞鸽传书源代码.rar JAVA帮助视图组件库 Help ...
Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...
新手学Java注解的最好资料,15分钟迅速开发
主要介绍了Java注解简单使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
一个java反射的例子,通过java反射机制,动态生成java实例,动态执行方法。例子中有大量注释,简单易懂。
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
Java圆形按钮实例代码,含注释
java分页技术,是java编程中常用的一项技术,java分页实例以例子的形式,讲述了一个班级中学生的记录是怎样实现分页的。代码中含有丰富的注释,可以让读者非常迅速的理解代码的含义,可以仿照这个例子,做任何分页的...
22个Java经典实例 带完美注释 Java经典实例(第二版)
Java圆形按钮实例代码,含注释.rar
是一个可以运行的JAVA应用程序 具有界面 有详细注解
Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...
收入了164个完整的、来自实战的Java编程实例,每个例子都有详尽的注释,全新的第二版涵盖了Java v1.3,实现了20个不同的Java API,其中包括Servelt、JSP、XML、Swing和Java2D java 网络高级编程(PDF) 介绍了网络...
Java网络编程的小例子,分服务器端和客户端,可以相互通信,有注释!