`

JavaSE学习笔记--Annotation

阅读更多
1、annotation是什么?:
Java注解提供了一套机制,让我们可以对类、方法、参数、包、域及变量等添加标准(即附加某些信息),且可以从源文件、class文件或者以在运行时反射的多种方式被读取。

2、常见的annotation:
a) Override注解表示子类要重写父类的对应方法。
b) Deprecated注解表示方法是不建议被使用的。
c) SuppressWarnings注解表示压制警告。

3、自定义注解:
当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用nam=value这种赋值方式,即明确指定给谁赋值。

自定义注解需注意的三点:
a) 当我们使用@interface自定义annotation时,实际上是隐含地继承了java.lang.annotation.Annotation接口。
b) 如果我们定义一个接口,并让该接口继承java.lang.annotation.Annotation接口,那么我们所定义的接口依然是一个接口,而不是注解。
c) Annotation本身是一个接口,而不是注解。

4、告知编译程序如何处理@Retention:
java.lang.annotation.Retention型态可以在你定义Annotation型态时,指示编译程序该如何对待你的自定义的Annotation型态,预设上编译程序会将Annotation信息留在.class文件中,但不会被虚拟机读取,而仅仅用于编译程序或工具程序运行时提供信息。

在使用Retention时,需要提供java.lang.annotation.RetentionPolicy的枚举类型
JDK中源码如下:
package java.lang.annotation;
public enum RetentionPolicy
{ 
    SOURCE,    //编译程序处理完Annotation信息后就完成任务,不会被编译到class文件中
    CLASS,       //编译程序将Annotation存储于class文件中,但不能被VM读取,缺省
    RUNTIME  //编译程序将Annotation存储于class文件中,可由VM读入,能通过反射读取到
}

RetentionPolicy为SOURCE的例子是@ SuppressWarnings
仅在编译时告知编译程序来抑制警告,所以不必把这个信息存储到.class文件中。

RetentionPolicy为RUNTIME的时机,可以像是你使用java设计一个代码分析工具,你必须让VM能读出Annotation信息,以便在分析程序时使用。搭配反射机制,就可以达到这个目的。

这时,我们来自定义一个注解,并将该注解标注为RUNTIME,然后通过反射来读取其注解的信息。

代码如下:

//自定义一个注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)//定义为RUNTIME可被反射读取
public @interface MyAnnotation 
{
	String hello() default "hello eric";
	String world();
}

//定义一个类,测试上面的注解:
public class MyTest 
{
	@MyAnnotation(world = "teng")
	public void output() 
	{
		System.out.println("output something");
	}
}

//写一个类通过反射API读取MyTest类中注解的信息
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[]{});
		
		//判断该方法上面是否有MyAnnotation这个注解
		if(method.isAnnotationPresent(MyAnnotation.class))
		{
			method.invoke(myTest, new Object[]{});
			
			MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
			String hello = myAnnotation.hello();
			String world = myAnnotation.world();
			
			System.out.println(hello);
			System.out.println(world);
		}

		//获取MyTest类中指定方法上的所有注解信息,并将其注解名打印出来
		Annotation[] annotations = method.getAnnotations();
		for(Annotation annotation : annotations)
		{
			System.out.println(annotation.annotationType().getName());
		}
	}
}


程序运行结果:
output something
hello eric
teng
com.annotation.MyAnnotation

5、@Target用来声明注解可以,被添加在哪些类型的元素上,如类型、方法和域等。在定义时要指定java.lang.annotation.ElementType的枚举值之一。
JDK中ElementType源码如下:
package java.lang.annotation
public enum ElementType
{
    Type,    //适用class,interface,enum
    FIELD,    //适用field
    METHOD,    //适用method
    PARAMETER,    //适用method里的parameter
    CONSTUCTOR,    //适用constructor
    LOCAL_VARIABLE,    //适用局部变量
    ANNOTATION_TYPE,    //适用annotation型态
    PACKAGE    //适用package
}


还是写一段代码来演示:
//自定义一个注解MyTarget:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)//表示该注解只能修饰方法
public @interface MyTarget
{
	String hello();
}


//写个类测试该注解:
public class MyTargetTest
{
	@MyTarget(hello="eric")//如果将该注解放在类之上,就会报错
	public void doSomething()
	{
		System.out.println("mytarget test");
	}
}


6、子类是否继承父类@Inherited?
默认上父类中的Annotation并不会被子类继承。若想让子类继承父类的Annotation,可以在定义Annotation时加上java.lang.annotation.Inherited型态的Annotation。
0
1
分享到:
评论

相关推荐

    传智播客javase全套笔记

    总的来说,【传智播客javase全套笔记】是一个全面的教程资源,涵盖了JavaSE学习的所有关键领域,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。通过系统地学习和实践,你可以逐步精通Java编程,为进阶...

    JavaSE笔记_工具.zip

    这份"JavaSE笔记_工具.zip"压缩包文件显然包含了关于JavaSE学习的重要笔记和可能的辅助工具,旨在帮助学习者从面向对象编程的基础到面向过程编程的转换。 面向对象编程(Object-Oriented Programming,OOP)是...

    Java基础尚硅谷宋红康学习笔记

    4. **注解(Annotation)**:注解提供了一种元数据,用于向编译器或JVM提供关于代码的附加信息,例如用于代码生成、编译时验证或运行时处理。 5. **集合框架高级**:包括List、Set、Map接口的高级实现,如TreeSet、...

    [Java学习笔记doc]-javase基本知识

    这份"Java学习笔记doc-javase基本知识"涵盖了Java SE的核心概念,对于初学者和有经验的开发者来说都是宝贵的参考资料。 1. **Java语法基础** - **关键字和标识符**:Java的关键字包括`public`, `private`, `...

    JavaSENote:JavaSE学习笔记

    JavaSENote是一份详细的JavaSE学习笔记,旨在帮助初学者和有经验的开发者深入理解Java语言的基本概念和技术。下面我们将深入探讨这份笔记可能包含的主要知识点。 1. **Java基础** - **环境配置**:安装JDK(Java ...

    JavaSE总结文档.rar

    这份"JavaSE总结文档.rar"包含了一份个人在复习JavaSE时编写的笔记,覆盖了多个主题,旨在巩固和深化对Java基础知识的理解。以下是根据压缩包中的文件名和JavaSE的一般知识体系,整理出的一些关键知识点: 1. **...

    JavaSE基础精讲笔记+案例分析

    JavaSE(Java Standard Edition)...总之,JavaSE基础精讲笔记全面覆盖了Java编程的各个方面,无论是初学者还是有一定经验的开发者,都能从中受益。通过深入学习和实践,可以为后续的JavaWeb和JavaEE开发打下坚实基础。

    JAVASE_Notes:来自itheima黑马的JavaSE基础笔记

    这份"JAVASE_Notes"包含了从itheima黑马机构获取的JavaSE基础学习笔记,适合初学者入门,特别是对编程一无所知的人。在学习过程中,结合视频教程会更加有效,比如可以在B站上找到相应的教学资源。 Java是一门面向...

    javase:我学习javaSE的笔记

    15. **注解(Annotation)**:注解是元数据,提供了一种安全的方式来将信息附加到代码中,编译器和JVM可以使用这些信息进行处理。 以上只是Java SE部分核心知识点的概述,实际学习中还会涉及更多的细节,例如集合...

    JAVA夜未眠(java学习笔记).rar

    "JAVA夜未眠(java学习笔记).rar"这个压缩包文件显然包含了作者在学习Java过程中积累的笔记,很可能是一份详尽的学习资源,旨在帮助新手理解并掌握Java语言的基础和核心概念。 Java学习笔记通常会覆盖以下几个重要的...

    JavaSE基础传智播客毕向东老师全程笔记PDF

    这份“JavaSE基础传智播客毕向东老师全程笔记PDF”是针对初学者和希望巩固Java基础知识的学习者而准备的宝贵资料。 笔记中可能涵盖了以下几个重要的JavaSE知识点: 1. **Java环境配置**:安装JDK(Java ...

    servlet-jsp学习笔记大全.docx

    在深入学习Servlet和JSP之前,首先需要对Java基础知识有扎实的理解。JavaSE,即Java Standard Edition,是Java语言的标准版,提供了最基本的类库。掌握JavaSE开发环境的搭建、基础语法、面向对象编程概念、数组操作...

    01JavaSE基础.zip

    本压缩包"01JavaSE基础.zip"包含的是作者根据动力节点的Java零基础教程视频编写的笔记,这些笔记详细地概述了Java SE的基本概念和核心特性,旨在帮助初学者更好地理解和掌握Java编程。 1. **Java环境搭建**:首先,...

    硅谷java基础每日复习eDiary

    以下是基于描述中提到的两个文件——"Java基础每日复习笔记-JavaSE基础阶段.edf"和"Java基础每日复习笔记-JavaSE高级阶段.edf"——所包含的知识点的详细阐述: 1. **Java SE基础阶段**: - **Java简介**:了解Java...

    魔乐科技JAVA培训笔记

    根据魔乐科技JAVA培训笔记,JAVASE基础部分的学习重点主要包括以下几个方面: ##### 面向对象 面向对象编程是Java的核心概念之一,涉及到类、对象、继承、封装、多态等概念。特别地,对于接口的理解和使用是关键...

    张龙 java se课程笔记

    张龙的Java SE课程笔记涵盖了这个领域的许多关键知识点。 1. **Java环境搭建**:首先,学习Java SE需要安装Java Development Kit (JDK),设置好环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,以便于编译和运行Java...

    eclipse-workspace.zip

    《Java学习笔记——JavaSE基础语法深度解析》 在编程世界中,Java语言以其强大的功能和跨平台特性占据着重要地位。本资料是针对Java初学者的珍贵资源,主要涵盖JavaSE的基础语法,通过实际的例子和详细的笔记,帮助...

    gitnote:Java学习过程中笔记内容

    【标题】"gitnote:Java学习过程中笔记内容"揭示了这是一个关于Java编程的学习资源,特别是针对JavaSE(标准版)和JavaEE(企业版)的学习笔记。这些笔记可能包含了作者在深入理解Java语言特性和应用时所记录的关键...

    狂神说笔记,个人觉得不赖

    在Java的学习过程中,注解(Annotation)和反射(Reflection)是两个非常关键且高级的主题。 注解是Java提供的一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器或者运行时环境用来执行...

    达内科技pdf JAVA 基础知识TTS课件

    5. **枚举与注解**:学习Java中的枚举类型,以及注解(Annotation)的应用和自定义。 6. **集合高级**:深入学习集合框架的高级特性和算法,如TreeSet、TreeMap的排序原理,以及List、Set、Map之间的关系。 这些...

Global site tag (gtag.js) - Google Analytics