• 自定义注解 使用反射实现切面编程


    sprig中我们在service层进行事务控制的时候,通常使用注解的方式进行,在service类上标注@transaction,下面我们就简单分析一下它是如何实现的,顺便复习一下反射的知识

    首先创建一个自定义注解类:

    package org.anno;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    //@Target(ElementType.METHOD)//该注解表示:使用HelloWord注解时 是放在方法上的  如果不写  表示可以放在任何地方
    //注解的存活时间
    @Retention(RetentionPolicy.RUNTIME)
    public @interface HelloWord {
        public String value() default "hello";//成员  既不是属性 也不是方法  hello是设置的缺省值
    }

    测试的实体Bean  在其中一个方法上使用自定义的注解

    package org.anno;
    //@HelloWord
    public class TestBean {
        //@HelloWord("张三")   //修改缺省值为张三
        private String name;
        
        
        public TestBean() {}
        public TestBean(String name) {this.name=name;}
            
        
        @HelloWord
        public void x() {
            System.out.println(this.name);
        }
        
    
    }

    反射类:

    package org.anno;
    
    import java.lang.reflect.Method;
    public class Parse {
    
        public void parse(Object object,String methodName) {
            Method[] methods = object.getClass().getMethods();//得到传递对象中的所有方法
            //判断  如果有对应的注解  就进行特定的操作
            for(Method m:methods) {
                if(m.getName().equals(methodName)) {//传递的字段和遍历的字段相等  进入
                    if(m.isAnnotationPresent(HelloWord.class)){//判断该方法的声明上是否有HelloWord类修饰过
                        //如果有的话,我们可以拿到该anno
                        HelloWord hw=m.getAnnotation(HelloWord.class);
                        //打印该anno中的值
                        //System.out.println(hw.value());
                        try {
                            System.out.println(hw.value()+"调用指定方法之前做。。。操作");//执行方法前做。。。 事务的控制
                            m.invoke(object,null);//调用对象中的指定方法
                            System.out.println(hw.value()+"调用指定方法之后做。。。操作");//执行方法之后做。。。。
                        } catch (Exception e) {
                            // TODO: handle exception
                            e.printStackTrace();
                        }
                        
                    }
                }
            }
        }
    }

    测试:

    package org.anno;
    
    import org.junit.Test;
    
    public class MainTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            TestBean testBean=new TestBean("abc");
            //要求:创建对象  输出对象中的x()方法
            //实现1:直接调用
            testBean.x();
            System.out.println("--------------------------");
            //实现2:通过反射技术  调用    在调用之前和之后  可以进行一些处理
            Parse p=new Parse();//
            p.parse(testBean,"x");
        }
    
    
    }

    结果:

    通常在方法的执行前后,可以进行一些操作,比如事务的控制。通过自定义注解做到切面编程。

  • 相关阅读:
    个人号微信机器人接口
    js tree 根据子节点找到所有父节点
    大数据分析之纳税人画像-实现和优化思路
    前后端分离项目安全漏洞修复总结
    多租户&多账户&多公众号_saas微信公众平台设计思路
    java7 try-with-resources 很香
    java7 异常处理增强
    java7 try-with-resources 很香
    mysql 按分数段,每个专业分数段统计人数
    一文看懂奈奎斯特定理和香农定理
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/8900332.html
Copyright © 2020-2023  润新知