为 java.io.FileOutputStream 编写 aspectj 切入点

Writing an aspectj pointcut for java.io.FileOutputStream

我想为 new FileInputstream(File file) 构造函数编写一个切入点。 例如, 在 java 中创建新文件的常用方法是:

File file = new File(myDirectory, "myFileName.txt");
new FileOutputStream(file);

到目前为止我试过的是:

里面 FileCreation.aj:

import java.io.File;
import java.io.FileOutputStream;

aspect FileCreation {

    pointcut FileOutputStream1(File file): call(FileOutputStream FileOutputStream(File)) && args(file);
    FileOutputStream around(File file): FileOutputStream1(file) {
        System.out.println("I was called!!");
        return proceed(file);
    }

}

为了测试这个钩子是否起作用,我添加了一条打印语句。

但是,它似乎没有被调用。

不确定这种情况下的错误是什么。

问题是无效的构造函数调用语法。您需要使用 .new 而不是 return 类型说明符,因为 return 类型隐式始终是拦截构造函数的 class。

顺便说一句,注意不要将方法命名为 classes。最好使用 fileOutputStream1 和小写的“f”作为切入点名称。否则,你的代码很难阅读。

package de.scrum_master.aspect;

import java.io.File;
import java.io.FileOutputStream;

aspect FileCreation {
  pointcut fileOutputStream1(File file) :
    call(FileOutputStream.new(File)) &&
    args(file);

  FileOutputStream around(File file) : fileOutputStream1(file) {
    System.out.println("I was called!!");
    return proceed(file);
  }
}