AspectJ中的org.aspectj.lang.JoinPoint接口的主要方法及使用

 

AspectJ 使用 org.aspectj.lang.JoinPoint 接口表示目標類連接點對象,如果是環繞增強,則使用 org.aspectj.lang.ProceedingJoinPoint 表示連接點對象,ProceedingJoinPoint 類是 JoinPoint 的子接口。

(1) JoinPoint 接口的主要方法:

  • java.lang.Object[] getArgs():獲取連接點方法運行時的入參列表;
  • Signature getSignature():獲取連接點的方法簽名對象;
  • java.lang.Object getTarget():獲取連接點所在的目標對象;
  • java.lang.Object getThis():獲取代理對象本身;

(2) ProceedingJoinPoint:

除了繼承上述四個方法外,還新增了兩個:

  • java.lang.Object proceed() throws java.lang.Throwable:通過反射執行目標對象的連接點處的方法;
  • java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通過反射執行目標對象的連接點處的方法,不過使用新的入參替換原來的入參。

 

下面通過具體的實例來看一下每個方法的用法。

這裏我們採用JDK代理的方式,首先定義一個接口,

package com.dz.demo.aspect;

/**
 * Created by dzwang on 2019/3/6.
 */
public interface Humanity {
    void speckTo(String name, String words);

    void walkTo(String place);
}

 它的實現類爲:

package com.dz.demo.aspect;

/**
 * Created by dzwang on 2019/3/6.
 */
public class Man implements Humanity {
    public void speckTo(String name, String words) {
        System.out.println("speckTo " + name + ": " + words);
    }

    public void walkTo(String place) {
        System.out.println("walkTo " + place);
    }
}

基礎工作完成好了之後,我們實現一個切面,增強方法的第一個入參聲明爲  org.aspectj.lang.ProceedingJoinPoint 類型:

package com.dz.demo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

/**
 * Created by dzwang on 2019/3/6.
 */
@Aspect
public class TestAspect {

    @Around("execution(* speckTo(..)) && target(com.dz.demo.aspect.Man)")
    public void testJoinPoint(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("****testJoinPoint start****");
        System.out.println("getArgs():" + pjp.getArgs());
        System.out.println("Arg0:" + pjp.getArgs()[0]);
        System.out.println("getSignature():" + pjp.getSignature().getName());
        System.out.println("getTarget():" + pjp.getTarget().getClass());
        System.out.println("getThis():" + pjp.getThis().toString());
        pjp.proceed();
        System.out.println("****testJoinPoint end****");
    }
}

定義好 spring 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                        http://www.springframework.org/schema/context
	                    http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.dz.demo.aspect">
    </context:component-scan>

    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <bean id="man" class="com.dz.demo.aspect.Man"></bean>
    <bean class="com.dz.demo.aspect.TestAspect"></bean>

</beans>

 最後,寫測試方法來看看 JoinPoint 類中各個方法的具體用途:

package com.dz.demo.aspect;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by dzwang on 2019/3/6.
 */
public class StartDemo {
    public static void main(String[] args) {
        String configPath = "classpath:beans.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(configPath);
        Humanity man = (Humanity) context.getBean("man");
        man.speckTo("Dennis", "Hello");
        man.walkTo("Company");
    }
}

輸出結果如下:

****testJoinPoint start****
getArgs():[Ljava.lang.Object;@4c178a76
Arg0:Dennis
getSignature():speckTo
getTarget():class com.dz.demo.aspect.Man
getThis():com.dz.demo.aspect.Man@4988d8b8
speckTo Dennis: Hello
****testJoinPoint end****
walkTo Company

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章