简介
AspectJ 织入方式有 Compile-time weaving
(编译时织入)、 Post-compile weaving
(后编译织入)、 Load-time weaving
(加载时织入)。
其中加载时织入不需要源码,可用于逆向分析。
安装
- 到 http://www.eclipse.org/aspectj/downloads.php 下载最新稳定版,我下载到的版本是
1.8.9
版。 - 双击下载好的jar包,一路 Next,提示安装路径时,我修改为了
D:\aspectj1.8
。 - 配置环境变量
ASPECTJ_HOME
=D:\aspectj1.8
CLASSPATH
=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%ASPECTJ_HOME%\lib\aspectjrt.jar
PATH
中添加%ASPECTJ_HOME%\bin
-
D:\aspectj1.8\doc\examples\ltw
这里有一些例子可供查看。
使用
// HelloWorld.java
public class HelloWorld {
public static void main (String[] args) {
System.out.println("Hello World!");
}
}
// Tracing.aj
public aspect Tracing {
private pointcut mainMethod () :
execution(public static void main(String[]));
before () : mainMethod() {
System.out.println("> " + thisJoinPoint);
}
after () : mainMethod() {
System.out.println("< " + thisJoinPoint);
}
}
上面是官方自带的例子,HelloWorld 是被织入的程序,Tracing.aj 相当于配置文件。
执行命令 javac HelloWorld.java
将 HelloWorld.java 编译为 HelloWorld.class
执行命令 ajc -outjar Tracing.jar -outxml Tracing.aj
将 Tracing.aj 编译为 Tracing.jar
使用命令 java HelloWorld
运行 HelloWorld 类,输出 Hello World!
。
使用命令 aj5 -classpath "Tracing.jar;%CLASSPATH%" HelloWorld
运行 HelloWorld 类,结果为
> execution(void HelloWorld.main(String[]))
Hello World!
< execution(void HelloWorld.main(String[]))
自己根据官方的例子写了个小demo:
// com/lanyus/Main.java
package com.lanyus;
/**
* Created by ilanyu on 2016/10/31.
*/
public class Main {
public int add(int x, int y) {
return x + y;
}
public static void main(String[] args) {
System.out.println(new Main().add(1, 2));
}
}
// Tracing1.aj
public aspect Tracing1 {
private pointcut mainMethod():
execution(public static void main(String[]));
before (): mainMethod() {
System.out.println("> " + thisJoinPoint);
}
after (): mainMethod() {
System.out.println("< " + thisJoinPoint);
}
private pointcut addMethod():
execution(public int add(int, int));
before (): addMethod() {
System.out.println("> " + thisJoinPoint);
System.out.println("args[0]: " + thisJoinPoint.getArgs()[0].toString());
System.out.println("args[1]: " + thisJoinPoint.getArgs()[1].toString());
}
after (): addMethod() {
System.out.println("< " + thisJoinPoint);
}
}
分别编译后
使用 java com.lanyus.Main
结果为 3
使用 aj5 -classpath "trancing1.jar;%CLASSPATH%" com.lanyus.Main
结果为
> execution(void com.lanyus.Main.main(String[]))
> execution(int com.lanyus.Main.add(int, int))
args[0]: 1
args[1]: 2
< execution(int com.lanyus.Main.add(int, int))
3
< execution(void com.lanyus.Main.main(String[]))
小提示
可使用 *
及 ..
通配符, 如
private pointcut main1Method () :
execution(* *.*(..));
before () : main1Method() {
System.out.println("> " + thisJoinPoint);
}
after () : main1Method() {
System.out.println("< " + thisJoinPoint);
}
文档在这 https://eclipse.org/aspectj/doc/next/progguide/quick-typePatterns.html
编写 .aj 文件
编写 .aj
文件时可以使用 IntelliJ IDEA ,过程如下:
- 新建J2SE项目。
- 项目根目录新建 libs 目录, 将
D:\aspectj1.8\lib\*
复制到libs, 在 libs 目录上右键点击Add as Library...
。 -
src
目录右键New
->Aspect
输入文件名即可编写.aj
文件。 - 有关于
.aj
文件的一些讲解,可以到官方文档( https://eclipse.org/aspectj/doc/released/progguide/index.html 、https://eclipse.org/aspectj/doc/next/progguide/quick.html)查看。
相关推荐
- 配置织入:配置织入策略,可以选择编译时织入(ajc编译器)、类加载时织入(AspectJ LTW)或运行时织入(Spring AOP)。 3. **AspectJlib-1.5.3.jar的使用场景**: - 日志记录:在关键操作前后自动插入日志记录...
NULL 博文链接:https://thinkdifferent.iteye.com/blog/2037754
AspectJlib-1.5.2.jar是该库的核心组件,包含了大量的类和方法,用于支持切面的声明、织入和运行时支持。开发者可以使用AspectJ的注解或XML配置文件来定义切面,这些切面可以包含切入点(Pointcut)和通知(Advice)...
aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 原来积分太高,我现在...
通过源码,你可以看到AspectJ如何实现切面的声明、定义切入点、织入增强、以及如何与Spring框架集成等核心功能。 另一个文件"license.txt"则包含了该库的许可协议信息,这通常会是开源软件使用的某种许可协议,如...
2. **织入切面**:AspectJ提供了编译时织入(CTW)和运行时织入(RTW)两种方式。CTW是在编译过程中将切面与目标代码结合,生成新的字节码;RTW则是在程序运行时动态地将切面插入到目标对象中。 3. **切点表达式**:...
《深入理解AspectJlib-1.5.2a.jar及其应用》 AspectJlib-1.5.2a.jar是一款基于Java平台的面向切面编程(AOP)库,它为开发者提供了一种强大的方式来处理横切关注点,如日志、事务管理等。这个版本1.5.2a是该库的一个...
《AspectJlib-1.6.2.jar:深入解析与应用》 AspectJlib-1.6.2.jar是一款在Java编程环境中广泛使用的库,它主要用于实现面向切面编程(AOP,Aspect-Oriented Programming)。这个版本1.6.2的发布,是AspectJ项目中的...
AspectJ提供了强大的语言扩展,包括切点(Pointcut)、通知(Advice)、织入(Weaving)等概念。切点定义了程序运行时的特定位置,例如某个方法的执行或异常的抛出。通知是与切点关联的行为,当切点匹配时,通知会被...
aspectj-1.7.0.jar aspectj的包
aspectj-1.8.14-src.jar
aspectj-1.9.6-src.jar
aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php
"aspectj-1.9.6.jar.7z" 文件是一个包含了AspectJ库版本1.9.6的压缩包,使用了7-Zip软件进行压缩,以提高文件传输和存储效率。 在Java开发中,AOP(面向切面编程)是一种设计模式,它有助于实现代码的模块化,将...
Spring支持运行时织入(Runtime Weaving, LTW),这通常通过加载时织入(Load-Time Weaving, LTW)实现,无需修改字节码或重新编译源码。 在"spring-aspectj-ltw-xml-based-demo"中,"applicationContext.xml"文件...
标签:aspectj-1.6.10-src.jar.zip,aspectj,1.6.10,src,jar.zip包下载,依赖包
4. **织入(Weaving)**:织入是将切面应用到目标对象的过程,AspectJ 提供了三种织入方式:编译时织入(使用 ajc 编译器)、加载时织入(使用 LTW,如 AspectJ Weaver)和构建时织入(如 Maven 或 Gradle 插件)。...
aspectj-1.9.0.BETA-3.jar
最新版本的aspectj-1.6.12.jar