簡體   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