自定义注解的实现

  注解看起来很神秘,其实看穿了就是一种标记,通过运行时获取标记进行后续处理。说到运行时自然离不开反射,所以注解就是反射的一种应用。使用元注解就可以实现自定义注解,元注解只有4个:Retention、Target、Document和Inherited,分别用于标记注解的保留策略、应用目标、是否包含于javadoc、是否允许子类继承。直接看代码:

package com.wulinfeng.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Type {

    String name() default "";
}
package com.wulinfeng.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Element {

    String value() default "";
}
package com.wulinfeng.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodName {

    int version() default 0;
}
package com.wulinfeng.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.TreeMap;

@Type(name = "hello")
public class Annotations {

    Map<Integer, Method> methodMap = new TreeMap<>();

    @Element("world")
    private String name;

    @MethodName(version = 1)
    public void logs1(Class<?> clazz) {

        // 取类注释值
        for (Annotation annotation : clazz.getAnnotations())
            if (annotation instanceof Type) {
                name = ((Type) annotation).name();
                break;
            }

        System.out.println("hello " + name);
    }

    @MethodName(version = 2)
    public void logs2(Class<?> clazz) {

        // 取字段name的注解值
        Field[] fields = Annotations.class.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(Element.class)) {
                Element element = field.getAnnotation(Element.class);
                name = element.value();
                break;
            }
        }

        System.out.println("hello " + name);
    }

    // 加载方法版本号映射
    public void initialize(Class<?> clazz) {
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            for (Annotation annotation : method.getAnnotations()) {
                if (annotation instanceof MethodName) {
                    methodMap.put(((MethodName) annotation).version(), method);
                }
            }
        }
    }

    // 根据方法版本号获取具体方法,通过反射执行方法
    public void execute(int version, Class<?> clazz)
            throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
        Method method = methodMap.get(version);

        Object o = clazz.newInstance();
        if (method != null) {
            method.invoke(o, clazz);
        }
    }

    public static void main(String[] args)
            throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {

        // 开始测试不同版本号的方法调用
        Annotations annotation = new Annotations();
        annotation.initialize(Annotations.class);
        annotation.execute(1, Annotations.class);
        annotation.execute(2, Annotations.class);
    }
}

 运行结果:

hello hello
hello world
时间: 2024-11-13 10:14:52

自定义注解的实现的相关文章

Java自定义注解

自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承Java.lang.Annotation这一接口,并且不能再去继承别的类或是接口. 2. 参数成员只能用public或默认(default)这两个访问权修饰 3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String.Enum.Class.annotations等数据类型,以及这一些类

【java开发系列】—— 自定义注解(转)

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

自定义注解框架的那些事

一.前言 距离上次更新已过一个半月,工作太忙也不是停更的理由.我这方面做得很不好,希望大家给予监督.首先会讲解[编译期资源注入],接着是[下拉刷新注入](通过注解来实现下拉刷新功能),最后打造一款[特色的注解框架]. 大家准备好公交卡了吗,开车了 - 二.什么是注解 每位童鞋对 注解 都有自己的理解,字面上的意思就是[额外的加入],在项目当中使用的注解的框架已经越来越多,如 : retrofit ,butterknife,androidannotations - 2017年Android百大框架

springmvc之自定义注解(annotation)

参考:日志处理 三:Filter+自定义注解实现 系统日志跟踪功能 1.项目结构 2.pom.xml,添加需要依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

自定义标签-自定义注解

首先是4个自定义注解类StaticResourceType.java public enum StaticResourceType { LESS,CSS,JS} StaticResource.java @Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface StaticResource { StaticResourceType type(); String path(); Dependenc

使用Spring处理自定义注解

使用Spring处理自定义注解 本文只讲思想,不讲代码. 可能的两种方法 spring schema spring aop aspect 参考1 dubbo service 包名:com.alibaba.dubbo.config 参考2 spring mvc 包名:org.springframework.web.servlet.config 可以参考这两个的实现,利用schema添加自定义注解并处理自己的注解,注册搜索模块. 源码分析 通过schema添加配置解析如: 在 spring配置文件中

Spring自定义注解实现Controller获取想要的数据

最近看组内一个哥们写了一个HandlerAdapter,能自动获取Http请求里面的Cookie并组装成一个Model来直接使用.觉得很牛逼.因此自己做了一个,特来分享. 原理: 利用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 在DispatcherServlet里面定义了: private List<HandlerAdapter> handlerAdapters; 用于

自定义注解+拦截器实现权限控制

根据5.2中的讲解,当监控high priority queue的PDSP channel设定好后,那么与之对应的event就知道了(PDSP channel与event一一对应)(注意5.x讲的是中断的配置,并不是exception的配置,4.x讲的是exception) 中断event与ISR配置代码如下,目的是使event与ISR建立联系: /*Configure event*/ EventCombinerEventConfig( systemEvent,  (TEventCombiner

自定义注解的简单使用

    框架开发时不免会涉及到配置文件,如properties.xml以及txt等格式的文件.这里介绍框架中通过自定义注解的形式简化配置: 根据需求编写自定义注解中的属性(这里以JDBCConfig为例,这是一个注入数据库常用配置的注解类) @Target是java的元注解(即修饰注解的注解),这里的@Target({METHOD,TYPE})指可以修饰方法.描述类.接口(包括注解类型) 或enum声明. @Retention是java中的运行时注解,可以划分为三类   1.RetentionP

转!java自定义注解

转自:http://blog.csdn.net/yixiaogang109/article/details/7328466  Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention