在平时开发过程中,使用注解是一件很平常的事情,但是至今没有自己编写过注解,于是打算自己搞个注解看一下处理流程。
下面的几个注解已经很熟悉了,是java内在的几个注解。
@Override注释能实现编译时检查,你可以为你的方法添加该注释,以声明该方法是用于覆盖父类中的方法。如果该方法不是覆盖父类的方法,将会在编译时报错。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释;
@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,
@SuppressWarnings与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了。
看下面简单的一个注解
/**
* (1)注解的定义类似接口,只不过在interface前面加一个@符号。
* (2)方法的名称就是参数的名称,返回值类型就是参数的类型。
* (3)可以通过default来声明参数的默认值。
* (4)通过@Retention和@Target这样的元注解,用来声明注解本身的行为。
*/
public @interface BixiaoAanTest {
String name() default "bixiao";
int age() default 10;
}
比较常见的几种元注解
@Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。
SOURCE,//注解在编译的时候被抛弃
CLASS,//编译到class文件中,但是虚拟机运行时不保留
RUNTIME//在class文件以及运行时的虚拟机中都能找到,可能被反射使用
@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。元素的值是一个数组,数据来源于枚举类型中。
TYPE,类、接口、或者枚举声明中
FIELD,属性
METHOD,方法
PARAMETER,参数
CONSTRUCTOR,构造方法
LOCAL_VARIABLE,局部变量
ANNOTATION_TYPE,注解
PACKAGE 包
@Documented 可以在javadoc中看到
@Inherited 注解中的数据可以被子类继承
(一)编译时处理注解
在JDK 6中,通过JSR 269把自定义注解处理器这一功能进行了规范化,有了新的javax.annotation.processing这个新的API。
对Mirror API也进行了更新,形成了新的javax.lang.model包。注解处理器的使用也进行了简化,不需要再单独运行apt这样的命令行工具,Java编译器本身就可以完成对注解的处理。对于同样的功能,如果用JSR 269的做法,只需要一个类就可以了。
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("annotation.Assignment")
public class AssignmentProcess extends AbstractProcessor {
private TypeElement assignmentElement;
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
Elements elementUtils = processingEnv.getElementUtils();
assignmentElement = elementUtils.getTypeElement("annotation.Assignment");
}
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(assignmentElement);
for (Element element : elements) {
processAssignment(element);
}
}
private void processAssignment(Element element) {
List<? extends AnnotationMirror> annotations = element.getAnnotationMirrors();
for (AnnotationMirror mirror : annotations) {
if (mirror.getAnnotationType().asElement().equals(assignmentElement)) {
Map<? extends ExecutableElement, ? extends AnnotationValue> values = mirror.getElementValues();
String assignee = (String) getAnnotationValue(values, "assignee"); //获取注解的值
}
}
}
}
(二)运行时处理注解(通过反射获取注解信息,然后进行处理,可以通过动态代理来简化)
如下面例子
public class TestDO {
@CheckPersons
public String name;//通过注解来看校验用户名称
public TestDO(String name) {
this.name = name;
}
public void doPrint(){
System.out.println(name);
}
public void doPrintByAnno() throws Exception{
CheckPersons check = TestDO.class.getField("name").getAnnotation(CheckPersons.class);
if(name.equals(check.name())){
System.out.println(name+" OK ");
}else{
System.out.println(name+" false");
}
}
public static void main(String[] args) throws Exception{
TestDO d1 = new TestDO("bixiao");
TestDO d2 = new TestDO("bixiao1");
d1.doPrintByAnno();
d2.doPrintByAnno();
}
}
参考:http://www.infoq.com/cn/articles/cf-java-annotation
分享到:
相关推荐
1. Java注解的应用:Java注解是Java语言中的一种元数据形式,用于为类、方法、变量等元素提供额外的信息,以供编译器或运行时系统使用。注解在Java 5版本中被引入。注解可以与反射机制结合使用,以动态地获取这些元...
"Java基础知识梳理" Java 是一种广泛使用的编程语言,适合初学者对 Java 相关知识的总结。下面是 Java 基础知识的梳理: 一、Java 开发环境 * JDK(Java Development Kit):可以开发编译与运行 JAVA 程序的工具...
这个名为"专注于梳理Java知识点,解析开源项目!这里都是文章代码的项目示例,好好学哈!.zip"的压缩包文件,显然是为了帮助学习者通过实际的项目源码来巩固和深化对Java的理解。以下将对Java的一些核心知识点进行...
根据提供的文件信息,我们可以梳理出SuperVCD管理系统的Java版本中的关键知识点,这些知识点主要涉及系统架构、用户界面设计、类的功能以及系统的核心模块等。 ### SuperVCD管理系统概述 SuperVCD管理系统是一款...
通过这个思维导图,学习者可以系统地梳理Java的基础知识,同时也能发现自己的薄弱环节,针对性地进行强化学习。如果你有任何优化建议或者疑问,欢迎提出,我们可以一起讨论和完善这个学习资源,共同提升在Java领域的...
根据提供的文件信息,以下是关于Java基础教程的知识点梳理: 1. Java语言的起源与发展:Java语言是由Sun Microsystems公司于1995年发布的,由James Gosling领导的小组开发。Java语言的早期代号为“Oak”,后来被...
梳理Java的Spring、MyBatis、SringMVC框架中所有常用注解,包括注解的作用域和注解的示例。帮助你快速查询和了解SSM框架。
PATH环境变量用于指定操作系统搜索可执行文件的路径,而CLASSPATH环境变量用于指定Java类加载器搜索类文件的路径。此外,还强调了Java语言的主要特点,例如面向对象、安全性、自动垃圾收集等。 通过这些习题答案,...
4. **@Override注解**:虽然不是必需的,但使用`@Override`注解可以明确表示程序员的意图,并且编译器会检查注解的方法是否真正覆盖了父类的方法,有助于防止错误。 接下来,我们来看重载(Overload)。重载是在同...
这个“Java任小龙版基础笔记.zip”压缩包包含了他在教学过程中的精华内容,便于学习者系统地学习Java。其中,“JAVA零基础入门教程笔记-任小龙”很可能是PDF或者文档形式的教程,详细讲解了Java的基础概念和语法。 ...
Java的基础包括语言语法、面向对象编程、接口、容器、异常处理、泛型、反射和注解。深入理解JVM(Java虚拟机)也至关重要,涉及类加载机制、字节码执行、内存模型、垃圾回收和性能优化。 在并发和多线程方面,你...
### Java基础梳理 #### 第一章 Java概述 Java是一种广泛使用的高级编程语言,以其平台无关性和面向对象的特点闻名。Java程序是由**类(class)**组成的,类是Java的基础单元,它包含了成员(members),主要包括属性...
- **注解与元数据**:注解是Java 5引入的新特性,可以用来标记代码、添加元数据等。 - **JVM原理**:对Java虚拟机(JVM)的基本工作原理进行讲解,包括内存模型、垃圾回收机制等。 - **Spring框架**:Spring是目前最...
Java 8通过`@FunctionalInterface`注解来标识一个接口为函数式接口。Lambda表达式可以显著简化代码,特别是在处理事件驱动和回调函数时。 例如,定义一个名为`LambdaInterface`的函数式接口: ```java public ...
源码的整理工作通常涉及到代码的归档、注释的完善以及功能模块的梳理,以便于其他开发者能够快速理解和复用。 首先,我们需要了解Java中的邮件API。JavaMail API是Java平台的标准库,用于处理邮件服务器的交互。它...
系统源代码采用主流的Java EE技术栈开发,包括前端页面、后端逻辑处理、数据库设计等模块,结构清晰,注释详细,便于学生理解和复用。 开题报告和答辩PPT则分别为学生提供了项目启动和项目总结阶段的必备材料,帮助...
在“运用X-mind线性思维对JAVA知识进行归纳”的主题中,我们通过思维导图的方式来系统地梳理和理解Java基础知识。 首先,我们需要了解Java的核心概念。Java基于C++,但去除了指针等复杂特性,使其更安全、更容易...
### Java面试评价表知识点梳理 #### 一、Java基础知识 - **语法基础**:考查面试者对于Java语言的基础语法掌握程度,例如变量声明、数据类型转换、运算符使用等。 - **算法基础**:评估面试者对常见算法的理解,...
根据给定的文件信息,我们可以提取以下Java图书管理系统的...通过以上知识点的梳理,我们可以对Java图书管理系统有一个全面的了解。从技术选型到具体实现,再到用户交互和系统管理,上述内容涉及了系统开发的多个方面。