部分信息来自《Thinking In Java》

注解也成为元数据。什么是元数据?就是“关于数据的数据”

注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。

它可以用来完整的描述程序所需的信息,能够让编译器来测试和验证格式,存储有关程序的额外信息。

定义一个注解:

注解的样子和接口很像

package me.benzeph.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation { }

定义注解时,需要一些元注解(关于注解的注解)例如:@Target和@Retention。

@Target用来定义你的注解应用于什么地方。例如:方法,域。

@Target(ElementType.METHOD)
@Target(ElementType.CONSTRUCTOR)
@Target(ElementType.PARAMETER)
...

@Retention用来定义你的注解在哪个级别可用。例如:源代码中,类文件中或者运行时。

@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.SOURCE)

如果一个注解中没有一个元素。那么它就称为标记注解。例如@Test。

在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序或工具可以利用这些值。

package me.benzeph.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public int value();
}
package me.benzeph.annotation;

public class UseAnnotation {
@MyAnnotation(value = 10)
public void useMyAnnotation() { }
}

如果没有读取注解的工具,那么注解也不会比注释更有用。

利用两个反射方法去解析一个含有某个注解的方法。

package me.benzeph.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int value();
}
package me.benzeph.annotation;

public class UseAnnotation {
@MyAnnotation(value = 10)
public void useMyAnnotation() { }
}
package me.benzeph.annotation;

import java.lang.reflect.Method;

public class MyAnnotationParser {

	public boolean findMethodByValue(int value) {
for (Method method : UseAnnotation.class.getDeclaredMethods()) {
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
if ((myAnnotation != null) && (myAnnotation.value() == value)) {
return true;
}
}
return false;
}
}
package me.benzeph.annotation;

import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; public class MyAnnotationParserTest { private MyAnnotationParser parser; @Before
public void setUp() throws Exception {
parser = new MyAnnotationParser();
} @Test
public void shouldReturnTrue() {
assertTrue(parser.findMethodByValue(10));
} @Test
public void shouldReturnFalse() {
assertFalse(parser.findMethodByValue(5));
}
}

Java注解的简单了解的更多相关文章

  1. java基础强化——深入理解java注解(附简单ORM功能实现)

    目录 1.什么是注解 2. 注解的结构以及如何在运行时读取注解 2.1 注解的组成 2.2 注解的类层级结构 2.3 如何在运行时获得注解信息 3.几种元注解介绍 3.1 @Retention 3.2 ...

  2. Java注解--实现简单读取excel

    实现工具类 利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了. 定义注解: @Retentio ...

  3. java注解的简单介绍

    什么是注解 1.注解就是Annontation,Annontation是Java5开始引入的新特征,中文名称叫做注解,它提供了一种安全的类似注释的机制,可以起到减少配置的成果,给程序起到辅助性的作用 ...

  4. 使用Java注解实现简单的依赖注入

    代码如下: /** * 注入的注解,为空,仅起标志作用 */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @int ...

  5. 关于Java注解(annotation)的简单理解

    一.什么是注解? 从 JDK5 开始,Java增加对元数据的支持,也就是注解.简单理解就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部 ...

  6. java注解简单使用

    java注解可以比喻成标签,可以贴在任何地方,也可以限制只能贴在固定地方,比如类上方.方法上方.属性[字段]上方等,然后通过反射,判断是否存在这个注解. 注解形式 public @interface ...

  7. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  8. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  9. spring纯java注解式开发(一)

    习惯了用XML文件来配置spring,现在开始尝试使用纯java代码来配置spring. 其实,spring的纯java配置,简单来说就是将bean标签的内容通过注解转换成bean对象的过程,没什么神 ...

随机推荐

  1. javascript——面向对象程序设计(3)

    <script type="text/javascript"> //1.结合使用构造函数模式和原型模式 //2.动态原型模式 //3.寄生构造函数模式 //4.稳妥构造 ...

  2. 1. mybatis批量插入数据

    通过list <insert id="saveByList" useGeneratedKeys="true" parameterType="ja ...

  3. CSAPP LAB: Buffer Overflow

    这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击.实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-ov ...

  4. 数据库,inner join,left join right join 的区别

    假设有两个表: 学生和课程 student:              class: id    student          id       class    studentId 1      ...

  5. CentOS 6.3 卷组挂载硬盘教程 linux的VPS如何分区

    XEN架构VPS提供的容量一般都不会低于10G,但大部分基于Xensystem面板的VPS默认挂载10G硬盘(第一磁盘),剩下的容量(第二磁盘)就需要通过手动挂载才能扩充默认的10G容量了.默认装完系 ...

  6. B题 - A+B for Input-Output Practice (I)

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description You ...

  7. centos下安装chdmg

    http://www.aboutyun.com/thread-9075-1-1.html  基本参考这个   yum clean all yum update     1.保证selinux关闭  / ...

  8. Mysql分页查询

    取前5条数据 select * from table_name limit 0,5 或 select * from table_name limit 5 取第11条到第15条数据,共5条 select ...

  9. 离奇“undefined reference”错误分析与解决方案

    离奇“undefined reference”错误分析与解决方案 “undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定 ...

  10. Linux下高并发网络编程

      Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...