AOP编程过程中的Signature接口

        此接口通常用于跟踪或记录应用程序以获取有关连接点的反射信息,下面是官方给的一个使用的例子

 aspect Logging {
       Logger logger = Logger.getLogger("MethodEntries");
   
       before(): within(com.bigboxco..*) && execution(public * *(..)) {
           Signature sig = thisJoinPoint.getSignature();
           logger.entering(sig.getDeclaringType().getName(),
                           sig.getName());
       }
   }

源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.aspectj.lang;

public interface Signature {
    String toString();
    //返回此签名的缩写字符串表示形式
    String toShortString();
    //返回此签名的扩展字符串表示形式
    String toLongString();
    //返回此签名的标识符部分。对于方法,这将返回方法名称。
    String getName();
    //返回表示为 int 的此签名上的修饰符。使用 java.lang.reflect.Modifier 上定义的常量和辅助方法来操作它,
    // 检查此签名是否公开 java.lang.reflect.Modifier.isPublic(sig.getModifiers());
    //  打印出修饰符 java.lang.reflect.Modifier.toString(sig.getModifiers());
    int getModifiers();
     //返回一个 java.lang.Class 对象,表示声明此成员的类、接口或方面。对于成员内声明,这将是声明成员的类型,而不是按词法写入声明的类型。使用 SourceLocation.getWithinType() 获取在词法上出现声明的类型。
    //为了与 java.lang.reflect.Member 保持一致,这个方法应该被命名为 getDeclaringClass()
    Class getDeclaringType();
    //返回声明类型的完全限定名称。这等效于调用 getDeclaringType().getName(),但是为了更高的效率缓存了结果
    String getDeclaringTypeName();
}

运行测试

package com.mz.testSpring.service;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author mazheng
 * @title: testAspect
 * @projectName test_spring
 * @description: TODO
 * @date 2021/11/3015:33
 */
@Component
@Aspect
public class testAspect {

    @After(value = "execution(* com.mz.testSpring.controler.testSpringControler.sayHello(..))")
    public void afterMethod(JoinPoint joinPoint){
        System.out.println("I'm fine ,thank you");
        //Signature测试
        Signature signature = joinPoint.getSignature();
        //方法测试

        System.out.println("toString; "+signature.toString());

        System.out.println("toShortString; "+signature.toShortString());

        System.out.println("toLongString; "+signature.toLongString());
   
        System.out.println("getName; "+signature.getName());
       
        System.out.println("getModifiers; "+signature.getModifiers());

        System.out.println("getDeclaringType; "+signature.getDeclaringType().getName());
 
        System.out.println("getDeclaringTypeName; "+signature.getDeclaringTypeName());

 

    }
}

HttpClient请求

GET http://localhost:8080/test/testAnno?name=Indian frends
Accept: application/json

运行结果

I'm fine ,thank you
toString; String com.mz.testSpring.controler.testSpringControler.sayHello(String)
toShortString; testSpringControler.sayHello(..)
toLongString; public java.lang.String com.mz.testSpring.controler.testSpringControler.sayHello(java.lang.String)
getName; sayHello
getModifiers; 1
getDeclaringType; com.mz.testSpring.controler.testSpringControler
getDeclaringTypeName; com.mz.testSpring.controler.testSpringControler

可以看出,Signature 也是为了获取原始方法的各种信息而存在的,并且信息更加的简洁,方便我们截取,他与JoinPoint合作可以让我们更方便的获取原始方法的各种信息(自己写字符串操作函数对JoinPoint接口的方法结果进行操作也是可以的,比较麻烦而已)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值