自定義註解 使用反射實現切面編程

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

 

一般在方法的執行先後,能夠進行一些操做,好比事務的控制。經過自定義註解作到切面編程。對象

相關文章
相關標籤/搜索