此接口通常用于跟踪或记录应用程序以获取有关连接点的反射信息,下面是官方给的一个使用的例子
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接口的方法结果进行操作也是可以的,比较麻烦而已)