如何通过 AspectJ 替换对 System.currentTimeMillis() 的标准调用?

问题描述 投票:0回答:1

我正在尝试用自己的值替换 System.currentTimeMillis() 。测试用例需要它。 代码示例:

package org.example.aspectj;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class TimeAspect
{
    @Around("execution(public static native long currentTimeMillis())")
    public long changeCallsToCurrentTimeInMillisMethod(ProceedingJoinPoint pjp)
    {
        return 0;
    }
}
package org.example.aspectj;

public class TimeDemo
{
    public static void main(String[] args) {
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println("currentTimeMillis -> " + currentTimeMillis);
    }
}
[warning] advice defined in org.example.aspectj.TimeAspect has not been applied [Xlint:adviceDidNotMatch]

看答案:

Task :TimeDemo.main()
  currentTimeMillis -> 1710770641050

所以时间没有改变。 怎么了?

java time system aspectj
1个回答
0
投票

您无法通过常规方式将方面编织到 JDK 类中,并且我不会在这里详细说明 JDK 编织的高级用例。

简单的解决方案是将方面编织到应用程序代码中,因为这是您在编译期间控制的内容。只需使用

call
而不是
execution
即可编织到 calling 代码而不是 scribed 代码中。

@Around("call(public static native long currentTimeMillis())")

更改后控制台日志:

currentTimeMillis -> 0
© www.soinside.com 2019 - 2024. All rights reserved.