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。
分享到:
相关推荐
总的来说,【传智播客javase全套笔记】是一个全面的教程资源,涵盖了JavaSE学习的所有关键领域,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。通过系统地学习和实践,你可以逐步精通Java编程,为进阶...
这份"JavaSE笔记_工具.zip"压缩包文件显然包含了关于JavaSE学习的重要笔记和可能的辅助工具,旨在帮助学习者从面向对象编程的基础到面向过程编程的转换。 面向对象编程(Object-Oriented Programming,OOP)是...
4. **注解(Annotation)**:注解提供了一种元数据,用于向编译器或JVM提供关于代码的附加信息,例如用于代码生成、编译时验证或运行时处理。 5. **集合框架高级**:包括List、Set、Map接口的高级实现,如TreeSet、...
这份"Java学习笔记doc-javase基本知识"涵盖了Java SE的核心概念,对于初学者和有经验的开发者来说都是宝贵的参考资料。 1. **Java语法基础** - **关键字和标识符**:Java的关键字包括`public`, `private`, `...
JavaSENote是一份详细的JavaSE学习笔记,旨在帮助初学者和有经验的开发者深入理解Java语言的基本概念和技术。下面我们将深入探讨这份笔记可能包含的主要知识点。 1. **Java基础** - **环境配置**:安装JDK(Java ...
这份"JavaSE总结文档.rar"包含了一份个人在复习JavaSE时编写的笔记,覆盖了多个主题,旨在巩固和深化对Java基础知识的理解。以下是根据压缩包中的文件名和JavaSE的一般知识体系,整理出的一些关键知识点: 1. **...
JavaSE(Java Standard Edition)...总之,JavaSE基础精讲笔记全面覆盖了Java编程的各个方面,无论是初学者还是有一定经验的开发者,都能从中受益。通过深入学习和实践,可以为后续的JavaWeb和JavaEE开发打下坚实基础。
这份"JAVASE_Notes"包含了从itheima黑马机构获取的JavaSE基础学习笔记,适合初学者入门,特别是对编程一无所知的人。在学习过程中,结合视频教程会更加有效,比如可以在B站上找到相应的教学资源。 Java是一门面向...
15. **注解(Annotation)**:注解是元数据,提供了一种安全的方式来将信息附加到代码中,编译器和JVM可以使用这些信息进行处理。 以上只是Java SE部分核心知识点的概述,实际学习中还会涉及更多的细节,例如集合...
"JAVA夜未眠(java学习笔记).rar"这个压缩包文件显然包含了作者在学习Java过程中积累的笔记,很可能是一份详尽的学习资源,旨在帮助新手理解并掌握Java语言的基础和核心概念。 Java学习笔记通常会覆盖以下几个重要的...
这份“JavaSE基础传智播客毕向东老师全程笔记PDF”是针对初学者和希望巩固Java基础知识的学习者而准备的宝贵资料。 笔记中可能涵盖了以下几个重要的JavaSE知识点: 1. **Java环境配置**:安装JDK(Java ...
在深入学习Servlet和JSP之前,首先需要对Java基础知识有扎实的理解。JavaSE,即Java Standard Edition,是Java语言的标准版,提供了最基本的类库。掌握JavaSE开发环境的搭建、基础语法、面向对象编程概念、数组操作...
本压缩包"01JavaSE基础.zip"包含的是作者根据动力节点的Java零基础教程视频编写的笔记,这些笔记详细地概述了Java SE的基本概念和核心特性,旨在帮助初学者更好地理解和掌握Java编程。 1. **Java环境搭建**:首先,...
以下是基于描述中提到的两个文件——"Java基础每日复习笔记-JavaSE基础阶段.edf"和"Java基础每日复习笔记-JavaSE高级阶段.edf"——所包含的知识点的详细阐述: 1. **Java SE基础阶段**: - **Java简介**:了解Java...
根据魔乐科技JAVA培训笔记,JAVASE基础部分的学习重点主要包括以下几个方面: ##### 面向对象 面向对象编程是Java的核心概念之一,涉及到类、对象、继承、封装、多态等概念。特别地,对于接口的理解和使用是关键...
张龙的Java SE课程笔记涵盖了这个领域的许多关键知识点。 1. **Java环境搭建**:首先,学习Java SE需要安装Java Development Kit (JDK),设置好环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,以便于编译和运行Java...
《Java学习笔记——JavaSE基础语法深度解析》 在编程世界中,Java语言以其强大的功能和跨平台特性占据着重要地位。本资料是针对Java初学者的珍贵资源,主要涵盖JavaSE的基础语法,通过实际的例子和详细的笔记,帮助...
【标题】"gitnote:Java学习过程中笔记内容"揭示了这是一个关于Java编程的学习资源,特别是针对JavaSE(标准版)和JavaEE(企业版)的学习笔记。这些笔记可能包含了作者在深入理解Java语言特性和应用时所记录的关键...
在Java的学习过程中,注解(Annotation)和反射(Reflection)是两个非常关键且高级的主题。 注解是Java提供的一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器或者运行时环境用来执行...
5. **枚举与注解**:学习Java中的枚举类型,以及注解(Annotation)的应用和自定义。 6. **集合高级**:深入学习集合框架的高级特性和算法,如TreeSet、TreeMap的排序原理,以及List、Set、Map之间的关系。 这些...