`

AspectJ Load-Time 织入(入门)

    博客分类:
  • JAVA
 
阅读更多

简介

AspectJ 织入方式有 Compile-time weaving (编译时织入)、 Post-compile weaving (后编译织入)、 Load-time weaving (加载时织入)。

其中加载时织入不需要源码,可用于逆向分析。

安装

  1. 到 http://www.eclipse.org/aspectj/downloads.php 下载最新稳定版,我下载到的版本是 1.8.9 版。
  2. 双击下载好的jar包,一路 Next,提示安装路径时,我修改为了D:\aspectj1.8
  3. 配置环境变量
    ASPECTJ_HOME = D:\aspectj1.8
    CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%ASPECTJ_HOME%\lib\aspectjrt.jar
    PATH 中添加 %ASPECTJ_HOME%\bin
  4. 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 ,过程如下:

  1. 新建J2SE项目。
  2. 项目根目录新建 libs 目录, 将D:\aspectj1.8\lib\*复制到libs, 在 libs 目录上右键点击Add as Library...
  3. src目录右键 New -> Aspect 输入文件名即可编写 .aj 文件。
  4. 有关于 .aj 文件的一些讲解,可以到官方文档( https://eclipse.org/aspectj/doc/released/progguide/index.html 、https://eclipse.org/aspectj/doc/next/progguide/quick.html)查看。
分享到:
评论

相关推荐

    aspectjlib-1.5.3.jar.zip

    - 配置织入:配置织入策略,可以选择编译时织入(ajc编译器)、类加载时织入(AspectJ LTW)或运行时织入(Spring AOP)。 3. **AspectJlib-1.5.3.jar的使用场景**: - 日志记录:在关键操作前后自动插入日志记录...

    Tomcat 7中配置AspectJ的Load Time weaving

    NULL 博文链接:https://thinkdifferent.iteye.com/blog/2037754

    aspectj-1.9.1.jar包及src文件

    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包。用于切面编程。 原来积分太高,我现在...

    aspectjlib-1.5.2.jar.zip

    AspectJlib-1.5.2.jar是该库的核心组件,包含了大量的类和方法,用于支持切面的声明、织入和运行时支持。开发者可以使用AspectJ的注解或XML配置文件来定义切面,这些切面可以包含切入点(Pointcut)和通知(Advice)...

    aspectjlib-1.5.3-sources.jar.zip

    通过源码,你可以看到AspectJ如何实现切面的声明、定义切入点、织入增强、以及如何与Spring框架集成等核心功能。 另一个文件"license.txt"则包含了该库的许可协议信息,这通常会是开源软件使用的某种许可协议,如...

    aspectjlib-1.5.0.jar.zip

    2. **织入切面**:AspectJ提供了编译时织入(CTW)和运行时织入(RTW)两种方式。CTW是在编译过程中将切面与目标代码结合,生成新的字节码;RTW则是在程序运行时动态地将切面插入到目标对象中。 3. **切点表达式**:...

    aspectjlib-1.5.2a.jar.zip

    《深入理解AspectJlib-1.5.2a.jar及其应用》 AspectJlib-1.5.2a.jar是一款基于Java平台的面向切面编程(AOP)库,它为开发者提供了一种强大的方式来处理横切关注点,如日志、事务管理等。这个版本1.5.2a是该库的一个...

    aspectjlib-1.6.2.jar.zip

    《AspectJlib-1.6.2.jar:深入解析与应用》 AspectJlib-1.6.2.jar是一款在Java编程环境中广泛使用的库,它主要用于实现面向切面编程(AOP,Aspect-Oriented Programming)。这个版本1.6.2的发布,是AspectJ项目中的...

    aspectj-1.9.6.jar

    AspectJ提供了强大的语言扩展,包括切点(Pointcut)、通知(Advice)、织入(Weaving)等概念。切点定义了程序运行时的特定位置,例如某个方法的执行或异常的抛出。通知是与切点关联的行为,当切点匹配时,通知会被...

    aspectj-1.7.0.jar

    aspectj-1.7.0.jar aspectj的包

    aspectj-1.8.14-src.jar

    aspectj-1.8.14-src.jar

    aspectj-1.9.6-src.jar

    aspectj-1.9.6-src.jar

    aspectj-1.9.5.jar

    aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php

    aspectj-1.9.6.jar.7z

    "aspectj-1.9.6.jar.7z" 文件是一个包含了AspectJ库版本1.9.6的压缩包,使用了7-Zip软件进行压缩,以提高文件传输和存储效率。 在Java开发中,AOP(面向切面编程)是一种设计模式,它有助于实现代码的模块化,将...

    spring-aspectj-ltw-xml-based-demo

    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,aspectj,1.6.10,src,jar.zip包下载,依赖包

    aspectj-1.8.13-src.jar

    4. **织入(Weaving)**:织入是将切面应用到目标对象的过程,AspectJ 提供了三种织入方式:编译时织入(使用 ajc 编译器)、加载时织入(使用 LTW,如 AspectJ Weaver)和构建时织入(如 Maven 或 Gradle 插件)。...

    aspectj-1.9.0.BETA-3.jar

    aspectj-1.9.0.BETA-3.jar

    aspectj-1.6.12.jar

    最新版本的aspectj-1.6.12.jar

Global site tag (gtag.js) - Google Analytics