zoukankan      html  css  js  c++  java
  • 自定义注解 使用反射实现切面编程

    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");
        }
    
    
    }

    结果:

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

  • 相关阅读:
    作用域和内存问题
    Javascript事件
    JavaScript学习总结(三)
    Javascript学习总结(二)
    JavaScript学习总结(一)
    vue开发搭建 1、 npm安装+vue脚手架安装 2、cnpm安装
    20181008
    RabbitMQ在.NetCore中的基础应用
    微软CRM 基于 ADFS自定义多重身份验证
    如何在ASP.NET Core中上传超大文件
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/8900332.html
Copyright © 2011-2022 走看看