• java自定义注解解析


    开始接触java注解的时候,感觉是个很高深的概念,经过一段时间的学习,对注解有了新的认识,并没有想象的那么复杂。

    注解本质上就是一个标记,是给程序看的。

    如果自定义了一个注解,但是没有对自定义的注解做任何解析,那么这个自定义注解完全没有任何作用,就像一个注释一样(但是注释主要是给人看的)。

    注解的存在主要是在一定程度上替换.XML配置文件(所以在使用注解的时候,注解中定义的值必须是一个常量)。

    package annotations;
    
    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 Information {
        String sex() default "female";
        Details[] details();
    }
    package annotations;
    
    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 Details {
        String details();
    }
    package annotations;
    
    public interface Person {
        void getInformation(String information);
    }
    package annotations;
    
    public class Student implements Person {
    
        @Override
        @Information(sex = "male",
        details = {
            @Details(details = "i am a student"),
            @Details(details = "i am a dancer")
            }
        )
        public void getInformation(String information) {
            System.out.println(information);
        }
    }
    package annotations;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    public class AnnotationTest {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
            Map<String, Map<String, Object>> AnnotaionsInAllMethodMap = new HashMap<>();
            Class<?> clazz = Class.forName("annotations.Student");
            Student student=(Student) clazz.newInstance();   
            Method[] methods = clazz.getDeclaredMethods();
            for(Method method:methods){
                Map<String, Object> AnnotaionsInOneMethodMap = new HashMap<>();
                if (method.isAnnotationPresent(Information.class)) {
                    Information information = method.getAnnotation(Information.class);
                    String sex=information.sex();
                    AnnotaionsInOneMethodMap.put("sex", sex);    
                    Details[] details=information.details();
                    StringBuilder mergeDetails=new StringBuilder();
                    for(Details detail:details){
                        mergeDetails = mergeDetails.append(detail.details());
                    }
                    AnnotaionsInOneMethodMap.put("Details", mergeDetails.toString());
                    method.invoke(student, AnnotaionsInOneMethodMap.toString());
                }
                AnnotaionsInAllMethodMap.put(method.getName(), AnnotaionsInOneMethodMap);
                
            }
        }
    }
    public @interface Information :注解本质上相当于一个借口,只不过是一个继承了Annotation的接口
    Information information = method.getAnnotation(Information.class); 通过动态代理,生成了一个实现@interface Information 特殊接口的代理实例


  • 相关阅读:
    http协议
    web应用
    前端基础-jquery
    jQuery的事件
    2.UML类图基本介绍
    1.设计模式的七大原则
    使用OpenFeign远程调用时请求头处理报错问题
    SpringCloud Config-分布式配置中心
    19. 类加载器详解
    18. 类加载过程详解
  • 原文地址:https://www.cnblogs.com/-cqq/p/10153137.html
Copyright © 2020-2023  润新知