我想做一些非常简单的事情.我有一个com.mypackage.Logger logger类,其实例化语句我想“插入”每个类,如下所示:private static Logger LOG = new Logger(Class.class).然后,我想记录项目中每个函数的每个入口和出口实例.这是我的方面:
public aspect LoggingAspect pertypewithin(*) {
private static Logger LOG;
pointcut classes(): within(com.mypackage..*) && !within(com.mypackage.Logger) && !within(com.mypackage.LoggingAspect);
pointcut functions(): classes() && (execution(* *(..)) || execution(new(..)));
before(): staticinitialization(*) && classes() {
LOG = new Logger(thisJoinPointStaticPart.getSignature().getDeclaringType());
}
before() : functions() {
LOG.trace("ENTER " + thisJoinPoint.getSignature().toLongString());
}
after() returning(@SuppressWarnings("unused") Object ret) : functions() {
LOG.trace("EXIT " + thisJoinPoint.getSignature().toLongString());
}
几乎一切都正常.我正确地按预期正确输入和存在日志语句.问题是与每个日志条目关联的日志记录类不正确.我正在使用log4j,每个日志条目的格式如下:
[TRACE](日期和时间戳)(日志记录类名)(线程名称)(一些日志记录语句)
问题是Logger实例化中使用的日志记录类与thisJoinPoint.getSignature().getDeclaringTypeName()指示的正确类别不匹配.
我知道我在静态Logger变量方面做的不对,所以请帮帮我.感谢您的时间!!!
最佳答案 这很简单
您的LOG属性定义为私有静态.静态意味着它是一个类属性,而不是实例属性.
这显然与您方面的实例模型相矛盾,后者是一种相关的(为每种类型创建的方面的一个实例).
尝试删除静态修改器.
顺便说一句,定义pertypewithin()*是非常大的,你可以限制与pertypewithin(classes())的匹配
对于日志记录的东西,我已经使用instanciation模型&做了一些AspectJ的实验.类型间声明.我会建议使用类型间声明的实现,因为它更节省内存: