为 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);
}
}
我想为 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);
}
}