![](/img/trans.png)
[英]How to generate a unique hash code for string input in android…?
[英]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.