简单实现自定义注解

在Java中创建自定义注解

创建自定义注解与编写接口很相似,除了它的接口关键字前有个@符号。 注意以下几点:

·注解方法不能有参数。 ·注解方法的返回类型局限于原始类型,字符串,枚举,注解,或以上类型构成的数组。 ·注解方法可以包含默认值。 ·注解可以包含与其绑定的元注解,元注解为注解提供信息,有四种元注解类型:

  1. @Documented – 表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分。
  2. @Target – 表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。
  3. @Inherited – 表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。
  4. @Retention – 表示注解类型保留时间的长短,它接收RetentionPolicy参数,可能的值有SOURCE, CLASS, 以及RUNTIME。

以下是一个简单自定义注解的实现过程:

首先创建自定义注解类Annotations,代码如下:

package com.dalaoyang.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Annotations {
    long time() default -1;
}

写一个简单的实现类:

package com.dalaoyang.test;


import java.util.Date;

/**
 * @author dalaoyang
 * @Description
 * @project java_custon_annotations
 * @package com.dalaoyang.test
 * @email 397600342@qq.com
 * @date 2018/3/27
 */
public class DoSomeThing {
    public void test() {
        System.out.println("执行自定义注解");
        System.out.println("执行自定义注解结束时间:"+new Date());

    }
}

然后写一个使用注解的类:

package com.dalaoyang.test;


public class Test {

    private DoSomeThing doSomeThing= new DoSomeThing();


    @Annotations
    public void test(){
        doSomeThing.test();
    }

}

最后利用反射,使注解可以使用:

package com.dalaoyang.test;


import java.lang.reflect.Method;
import java.util.Date;


// 反射注解
public class AnnotationsRunner {
    public static void main(String[] args) throws Exception {
        System.out.println("执行自定义注解开始时间:"+new Date());
        Class clazz = Test.class;
        Method[] ms = clazz.getMethods();
        for (Method method : ms) {
            boolean flag = method.isAnnotationPresent(Annotations.class);
            if (flag) {
                method.invoke(clazz.newInstance(), null);
            }
        }
    }
}

执行AnnotationsRunner类中得main函数,可以看到控制台如下所示:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏纯洁的微笑

jvm系列(五):Java GC 分析

Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)...

76440
来自专栏武培轩的专栏

剑指Offer-包含min函数的栈

package Stack; import java.util.Stack; /** * 包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个...

28460
来自专栏PPV课数据科学社区

2014年八大最热门的大数据工作

大数据时代,数据过剩,人才短缺,越来越多的IT专业人士希望能够进入充满机遇的大数据领域,但是,到底哪些具体的大数据专业岗位和人才最为吃香呢?人力资源公司Kfor...

31240
来自专栏纯洁的微笑

jvm系列(十):教你如何成为Java的OOM Killer

此文出处云时代架构,作者:李艳鹏 教你如何成为Java的OOM Killer 前言 虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,...

72740
来自专栏纯洁的微笑

微服务(Microservice)那点事

摘要: 微服务架构被提出很短的时间内,就被越来越多的开发人员推崇,简单来说其主要的目的是有效的拆分应用,实现敏捷开发和部署 。本分享即尝试介绍微服务架构的一些实...

32560
来自专栏专注 Java 基础分享

Java 内部类的意义及应用

众所周知,我们的 C++ 程序语言是多继承制的,而多继承明显的好处就是,相对而言只需要写较少的代码即可完成一个类的定义,因为我们可以通过继承其它类来获取别人的实...

36740
来自专栏武培轩的专栏

Runtime源码解析(JDK1.8)

package java.lang; import sun.reflect.CallerSensitive; import sun.reflect.Refle...

38590
来自专栏纯洁的微笑

jvm系列(六):Java服务GC参数调优案例

本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响。 这段时间在整理jvm系列的文章,无意中发现本文...

60040
来自专栏个人随笔

初识jQuery 基础篇

首先提供一个知识点外资源: 在线编程:无需编程环境:   https://codepen.io/pen   添加jQuery库:     Settings-->...

40060
来自专栏武培轩的专栏

剑指Offer-栈的压入、弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压...

35670

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励