org.aspectj是Java编程语言的一个AOP(面向切面编程)的实现。它是AspectJ工具的一个组成部分,是一个Java语言的扩展,它允许您为Java应用程序中的程序范围添加声明性的、简单、特定的代码。本文将从多个方面对org.aspectj进行详细的阐述。
一、org.aspectj 包
org.aspectj包包含一组AspectJ核心API,它们的目的是为了保持AOP的通用性。其中最重要的两个模块是:aspectjrt.jar
和aspectjweaver.jar
。其中,aspectjrt.jar
包含了最基本的AspectJ APIs,包括Runtime支持、基本数据结构等。
org.aspectj
aspectjrt
1.8.13
另一个主要的包就是aspectjweaver.jar
,该包包含了一个Java编译器的扩展,可以识别AspectJ的语言扩展与语法,它可以支持在Java代码中嵌入AspectJ的横切关注点。
org.aspectj
aspectjweaver
1.8.13
provided
二、org.aspectj依赖爆红
org.aspectj的开发需要导入_aspectjrt.jar和_aspectjweaver.jar等多个JAR包。这样就容易造成传统的打包方式(将这些JAR包lib下复制到打包的JAR文件中)时,动态classloader取父ClassLoader中的类而抛出ClassNotFoundException的问题,即导致编译上下文与运行上下文不一致的问题。解决方法是为org.aspectj制作一个FatJAR文件,将所有的依赖项都打包到同一JAR文件中。
org.apache.maven.plugins
maven-assembly-plugin
2.6
posix
jar-with-dependencies
三、org.aspectj不存在
org.aspectj的开发需要加入相关的插件,但在一些IDE中,org.aspectj插件未被默认加载,需要手动安装。
org.aspectj
aspectj-maven-plugin
1.11
compile
test-compile
四、org.aspectj.lang.annotation
org.aspectj.lang.annotation包定义了一组注释,以简单和方便的方式将方面应用于Java类,方法和属性。从功能上来说,在使用Java 5注释的情况下,AspectJ注释分别起到描述性元素(AspectJ定义通知的方法)和元数据元素(Element注解指定元数据)的作用。
下面是一个使用@Aspect注释的简单例子:
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.*;
@Aspect
public class ExampleAspect
{
@Pointcut("execution(* example.Example.method(..))")
public void exampleMethod() {}
@After("exampleMethod()")
public void intercept() {
//处理中间代码
}
}
五、org.aspectj.lang.JoinPoint
org.aspectj.lang.JoinPoint包含有关连接点的信息。连接点是在执行应用程序时AOP切面接收通知的特定点,例如调用构造函数或调用方法。
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.*;
@Aspect
public class ExampleAspect
{
@Pointcut("execution(* example.Example.method(..))")
public void exampleMethod() {}
@After("exampleMethod()")
public void intercept(JoinPoint jp) {
//打印连接点相关信息
System.out.println("Signature: " + jp.getSignature());
System.out.println("Args: " + Arrays.toString(jp.getArgs()));
//处理中间代码
}
}
六、org.aspectj.lang不存在
在使用AspectJ时,如果没有定义真实的pointcuts,那么直接使用@AspectJ注释就会导致问题。在编写代码时,需要确保org.aspectj.lang包可用。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class ExampleAspect
{
@Around("execution(* example.Example.method(..))")
public Object intercept(ProceedingJoinPoint pjp) throws Throwable {
//处理中间代码
Object result = pjp.proceed();
//处理中间代码
return result;
}
}
结束语
本文详细介绍了org.aspectj的多个方面,包括其基本API、依赖问题、包和注释等。希望这些信息对于您在使用org.aspectj时会有所帮助。