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

时间:2022-02-02 11:59:14

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


}

结果:

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

 

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