`
iamzhongyong
  • 浏览: 804552 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

系统梳理Java注解

    博客分类:
  • java
 
阅读更多

 在平时开发过程中,使用注解是一件很平常的事情,但是至今没有自己编写过注解,于是打算自己搞个注解看一下处理流程。

         下面的几个注解已经很熟悉了,是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

 

 

分享到:
评论

相关推荐

    一种基于Java注解和反射机制的Excel文件读写操作方法.pdf

    1. Java注解的应用:Java注解是Java语言中的一种元数据形式,用于为类、方法、变量等元素提供额外的信息,以供编译器或运行时系统使用。注解在Java 5版本中被引入。注解可以与反射机制结合使用,以动态地获取这些元...

    Java基础知识梳理

    "Java基础知识梳理" Java 是一种广泛使用的编程语言,适合初学者对 Java 相关知识的总结。下面是 Java 基础知识的梳理: 一、Java 开发环境 * JDK(Java Development Kit):可以开发编译与运行 JAVA 程序的工具...

    专注于梳理Java知识点,解析开源项目!这里都是文章代码的项目示例,好好学哈!.zip

    这个名为"专注于梳理Java知识点,解析开源项目!这里都是文章代码的项目示例,好好学哈!.zip"的压缩包文件,显然是为了帮助学习者通过实际的项目源码来巩固和深化对Java的理解。以下将对Java的一些核心知识点进行...

    SuperVCD管理系统java版完整代码带各种注释.docx

    根据提供的文件信息,我们可以梳理出SuperVCD管理系统的Java版本中的关键知识点,这些知识点主要涉及系统架构、用户界面设计、类的功能以及系统的核心模块等。 ### SuperVCD管理系统概述 SuperVCD管理系统是一款...

    Java基础思维导图

    通过这个思维导图,学习者可以系统地梳理Java的基础知识,同时也能发现自己的薄弱环节,针对性地进行强化学习。如果你有任何优化建议或者疑问,欢迎提出,我们可以一起讨论和完善这个学习资源,共同提升在Java领域的...

    java基础教程-pdf注释版-我的入门资料

    根据提供的文件信息,以下是关于Java基础教程的知识点梳理: 1. Java语言的起源与发展:Java语言是由Sun Microsystems公司于1995年发布的,由James Gosling领导的小组开发。Java语言的早期代号为“Oak”,后来被...

    SSM框架所有常用注解梳理

    梳理Java的Spring、MyBatis、SringMVC框架中所有常用注解,包括注解的作用域和注解的示例。帮助你快速查询和了解SSM框架。

    java开发实战经典习题答案

    PATH环境变量用于指定操作系统搜索可执行文件的路径,而CLASSPATH环境变量用于指定Java类加载器搜索类文件的路径。此外,还强调了Java语言的主要特点,例如面向对象、安全性、自动垃圾收集等。 通过这些习题答案,...

    Java重写和重载概念及区别梳理

    4. **@Override注解**:虽然不是必需的,但使用`@Override`注解可以明确表示程序员的意图,并且编译器会检查注解的方法是否真正覆盖了父类的方法,有助于防止错误。 接下来,我们来看重载(Overload)。重载是在同...

    Java任小龙版基础笔记.zip

    这个“Java任小龙版基础笔记.zip”压缩包包含了他在教学过程中的精华内容,便于学习者系统地学习Java。其中,“JAVA零基础入门教程笔记-任小龙”很可能是PDF或者文档形式的教程,详细讲解了Java的基础概念和语法。 ...

    Java后端学习路线梳理(csdn)————程序.pdf

    Java的基础包括语言语法、面向对象编程、接口、容器、异常处理、泛型、反射和注解。深入理解JVM(Java虚拟机)也至关重要,涉及类加载机制、字节码执行、内存模型、垃圾回收和性能优化。 在并发和多线程方面,你...

    java基础梳理

    ### Java基础梳理 #### 第一章 Java概述 Java是一种广泛使用的高级编程语言,以其平台无关性和面向对象的特点闻名。Java程序是由**类(class)**组成的,类是Java的基础单元,它包含了成员(members),主要包括属性...

    Java开发之道 pdf

    - **注解与元数据**:注解是Java 5引入的新特性,可以用来标记代码、添加元数据等。 - **JVM原理**:对Java虚拟机(JVM)的基本工作原理进行讲解,包括内存模型、垃圾回收机制等。 - **Spring框架**:Spring是目前最...

    Java8新特性知识梳理

    Java 8通过`@FunctionalInterface`注解来标识一个接口为函数式接口。Lambda表达式可以显著简化代码,特别是在处理事件驱动和回调函数时。 例如,定义一个名为`LambdaInterface`的函数式接口: ```java public ...

    JAVA+WEB邮件系统源码源码整理

    源码的整理工作通常涉及到代码的归档、注释的完善以及功能模块的梳理,以便于其他开发者能够快速理解和复用。 首先,我们需要了解Java中的邮件API。JavaMail API是Java平台的标准库,用于处理邮件服务器的交互。它...

    Java毕业设计-基于J2EE的B2C电子商务系统开发(论文+系统+开题报告+答辩PPT+中期报表)

    系统源代码采用主流的Java EE技术栈开发,包括前端页面、后端逻辑处理、数据库设计等模块,结构清晰,注释详细,便于学生理解和复用。 开题报告和答辩PPT则分别为学生提供了项目启动和项目总结阶段的必备材料,帮助...

    运用X-mind线性思维对JAVA知识进行归纳

    在“运用X-mind线性思维对JAVA知识进行归纳”的主题中,我们通过思维导图的方式来系统地梳理和理解Java基础知识。 首先,我们需要了解Java的核心概念。Java基于C++,但去除了指针等复杂特性,使其更安全、更容易...

    java面试评价表

    ### Java面试评价表知识点梳理 #### 一、Java基础知识 - **语法基础**:考查面试者对于Java语言的基础语法掌握程度,例如变量声明、数据类型转换、运算符使用等。 - **算法基础**:评估面试者对常见算法的理解,...

    java图书管理系统.pdf

    根据给定的文件信息,我们可以提取以下Java图书管理系统的...通过以上知识点的梳理,我们可以对Java图书管理系统有一个全面的了解。从技术选型到具体实现,再到用户交互和系统管理,上述内容涉及了系统开发的多个方面。

Global site tag (gtag.js) - Google Analytics