繁体   English   中英

如何为方法实例生成唯一的 hash 代码?

[英]How to generate a unique hash code for a method instance?

我正在使用 Aspectj 进行一些分析。

我需要唯一标识访问该字段的方法的实例例如:

public class Class{ int a; int b;
public void method1(){

  setA(5);
  setB(6); 

在这种使用 AspectJ 的情况下,我可以通过 setA 和 SetB 方法获得对 a 的访问和对 b 的访问。

Thread.currentThread().getStackTrace();

我可以知道setA和setB已经被method1()调用了。

方法的名称是不够的,我还需要明确地识别方法的实例。

例如,如果多次调用 method1,我必须辨别对 a 的访问和对 b 的访问是由 method1 的不同实例进行的。

任何建议如何获取方法执行的实例哈希码?

一个可能有效的简单(未经测试,使用风险自负)的解决方案是为每个线程的每个方法维护一个计数器:

private static final ConcurrentHashMap<String, ConcurrentHashMap<Long, AtomicInteger>>
    COUNTERS = new ConcurrentHashMap<>();

public static int getInvocationId(String methodName, long threadId) {
    return counter(methodName, threadId).getAndIncrement();
}

private static AtomicInteger counter(String methodName, long threadId) {
    ConcurrentHashMap<Long, AtomicInteger> map = countersForMethodName(methodName);
    AtomicInteger counter = map.get(threadId);
    if (counter == null) {
        AtomicInteger newCounter = new AtomicInteger();
        counter = map.putIfAbsent(threadId, newCounter);
        if (counter == null) {
            return newCounter;
        }
    }
    return counter;
}

private static ConcurrentHashMap<Long, AtomicInteger> countersForMethodName(
    String methodName) {
    ConcurrentHashMap<Long, AtomicInteger> map = COUNTERS.get(methodName);
    if (map == null) {
        ConcurrentHashMap<Long, AtomicInteger> newMap = new ConcurrentHashMap<>();
        map = COUNTERS.putIfAbsent(methodName, newMap);
        if (map == null) {
            return newMap;
        }
    }
    return map;
}

然后,在您的建议中,类似:

int invocationId = getInvocationId(thisJoinPoint.getSignature().getName(),
    Thread.currentThread().getId());
// do what you want with invocationId 

请注意,这依赖于在与目标方法相同的线程中执行的建议——不幸的是,我对 AspectJ 不够熟悉,无法知道这个假设是否总是成立。

警告:如果您的环境一直在创建和过期新线程,那么上述树继续增长(本质上是 memory 泄漏)。 如果这是一个问题,那么您需要添加一些其他代码来定期枚举所有活动线程,并从树中删除过期条目。 在这种情况下,您可能希望使用 map 每个线程 id,然后使用每个方法名称,以提高修剪效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM