gpt4 book ai didi

eclipse - 如何在每个类中设置一个静态变量?

转载 作者:行者123 更新时间:2023-12-01 04:06:21 27 4
gpt4 key购买 nike

我正在尝试做一些非常简单的事情。我有一个 com.mypackage.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 属性定义为私有(private) 静态 .静态意味着这是一个 类属性 ,而不是实例属性。

这显然与 相矛盾。实例化模型您的方面,它是 pertypewithin(为每种类型创建的方面的一个实例)。

尝试删除 静态 修饰符。

顺便说一句,定义 pertypewithin()* 是相当大的,你可以限制与 pertypewithin(classes()) 的匹配

对于日志记录,我使用实例化模型和类型间声明对 AspectJ 进行了一些实验。我建议使用类型间声明来实现,因为它更节省内存:

Logger injection with perthis

Logger injection with inter-type declaration

关于eclipse - 如何在每个类中设置一个静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com