Java Annotation认知(包括框架图、详细介绍、示例说明)
2013-09-28 14:01
801 查看
[b]摘要[/b]
Java Annotation是JDK5.0引入的一种注释机制。
网上很多关于Java Annotation的文章,看得人眼花缭乱。Java Annotation本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。
我按照自己的思路,对Annotation进行了整理。理解 Annotation 的关键,是理解Annotation的语法和用法,对这些内容,我都进行了详细说明;理解Annotation的语法和用法之后,再看Annotation的框架图,可能有更深刻体会。废话就说这么多,下面开始对Annotation进行说明。若您发现文章中存在错误或不足的地方,希望您能指出!
[b]第1部分 Annotation架构[/b]
先看看Annotation的架构图:
View Code
上面是该程序在eclipse中的截图。从中,我们可以发现“getString()”函数会报错。这是因为“getString() 被@Override所标注,但在OverrideTest的任何父类中都没有定义getString1()函数”。
“将getString() 上面的@Override注释掉”,即可解决该错误。
[b]2 在反射中使用Annotation[/b]
在反射的Class, Method, Field等函数中,有许多于Annotation相关的接口。
这也意味着,我们可以在反射中解析并使用Annotation。
源码如下(AnnotationTest.java):
运行结果:
somebody: lily, 18
girl, boy,
@com.skywang.annotation.MyAnnotation(value=[girl, boy])
empty
unknown,
@com.skywang.annotation.MyAnnotation(value=[unknown])
@java.lang.Deprecated()
[b]3 根据Annotation生成帮助文档[/b]
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。
[b]4 能够帮忙查看查看代码[/b]
通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构。
另外,我们也可以通过自定义Annotation来实现一些功能。
[b]点击查看:更多内容[/b]
Java Annotation是JDK5.0引入的一种注释机制。
网上很多关于Java Annotation的文章,看得人眼花缭乱。Java Annotation本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。
我按照自己的思路,对Annotation进行了整理。理解 Annotation 的关键,是理解Annotation的语法和用法,对这些内容,我都进行了详细说明;理解Annotation的语法和用法之后,再看Annotation的框架图,可能有更深刻体会。废话就说这么多,下面开始对Annotation进行说明。若您发现文章中存在错误或不足的地方,希望您能指出!
[b]第1部分 Annotation架构[/b]
先看看Annotation的架构图:
package com.skywang.annotation; /** * @Override测试程序 * * @author skywang * @email kuiwu-wang@163.com */ public class OverrideTest { /** * toString() 在java.lang.Object中定义; * 因此,这里用 @Override 标注是对的。 */ @Override public String toString(){ return "Override toString"; } /** * getString() 没有在OverrideTest的任何父类中定义; * 但是,这里却用 @Override 标注,因此会产生编译错误! */ @Override public String getString(){ return "get toString"; } public static void main(String[] args) { } }
View Code
上面是该程序在eclipse中的截图。从中,我们可以发现“getString()”函数会报错。这是因为“getString() 被@Override所标注,但在OverrideTest的任何父类中都没有定义getString1()函数”。
“将getString() 上面的@Override注释掉”,即可解决该错误。
[b]2 在反射中使用Annotation[/b]
在反射的Class, Method, Field等函数中,有许多于Annotation相关的接口。
这也意味着,我们可以在反射中解析并使用Annotation。
源码如下(AnnotationTest.java):
package com.skywang.annotation; import java.lang.annotation.Annotation; import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Inherited; import java.lang.reflect.Method; /** * Annotation在反射函数中的使用示例 * * @author skywang * @email kuiwu-wang@163.com */ @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { String[] value() default "unknown"; } /** * Person类。它会使用MyAnnotation注解。 */ class Person { /** * empty()方法同时被 "@Deprecated" 和 “@MyAnnotation(value={"a","b"})”所标注 * (01) @Deprecated,意味着empty()方法,不再被建议使用 * (02) @MyAnnotation, 意味着empty() 方法对应的MyAnnotation的value值是默认值"unknown" */ @MyAnnotation @Deprecated public void empty(){ System.out.println("\nempty"); } /** * sombody() 被 @MyAnnotation(value={"girl","boy"}) 所标注, * @MyAnnotation(value={"girl","boy"}), 意味着MyAnnotation的value值是{"girl","boy"} */ @MyAnnotation(value={"girl","boy"}) public void somebody(String name, int age){ System.out.println("\nsomebody: "+name+", "+age); } } public class AnnotationTest { public static void main(String[] args) throws Exception { // 新建Person Person person = new Person(); // 获取Person的Class实例 Class<Person> c = Person.class; // 获取 somebody() 方法的Method实例 Method mSomebody = c.getMethod("somebody", new Class[]{String.class, int.class}); // 执行该方法 mSomebody.invoke(person, new Object[]{"lily", 18}); iteratorAnnotations(mSomebody); // 获取 somebody() 方法的Method实例 Method mEmpty = c.getMethod("empty", new Class[]{}); // 执行该方法 mEmpty.invoke(person, new Object[]{}); iteratorAnnotations(mEmpty); } public static void iteratorAnnotations(Method method) { // 判断 somebody() 方法是否包含MyAnnotation注解 if(method.isAnnotationPresent(MyAnnotation.class)){ // 获取该方法的MyAnnotation注解实例 MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class); // 获取 myAnnotation的值,并打印出来 String[] values = myAnnotation.value(); for (String str:values) System.out.printf(str+", "); System.out.println(); } // 获取方法上的所有注解,并打印出来 Annotation[] annotations = method.getAnnotations(); for(Annotation annotation : annotations){ System.out.println(annotation); } } }
运行结果:
somebody: lily, 18
girl, boy,
@com.skywang.annotation.MyAnnotation(value=[girl, boy])
empty
unknown,
@com.skywang.annotation.MyAnnotation(value=[unknown])
@java.lang.Deprecated()
[b]3 根据Annotation生成帮助文档[/b]
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。
[b]4 能够帮忙查看查看代码[/b]
通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构。
另外,我们也可以通过自定义Annotation来实现一些功能。
[b]点击查看:更多内容[/b]
相关文章推荐
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明) (转)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java Annotation认知(包括框架图、详细介绍、示例说明)
- Java 集合框架--ArrayList详细介绍和使用示例
- java Hashtable详细介绍(源码解析)和使用示例
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- JAVA HashMap详细介绍和示例
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
- 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
- Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例