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

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

 

首先建立一个自定义注解类:编程

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

}

反射类:this

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

测试:spa

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


}

结果:code

 

一般在方法的执行先后,能够进行一些操做,好比事务的控制。经过自定义注解作到切面编程。对象

相关文章
相关标签/搜索