我在想,如果有一個測試或知道如果一個函數被調用,以分配或不,我的意思是告訴之間的區別的某種方式分配...測試與函數
int x = getX();
,只是,
getX();
這沒有任何實際用途,但我認爲這將是很好的知道。
可能嗎?
我在想,如果有一個測試或知道如果一個函數被調用,以分配或不,我的意思是告訴之間的區別的某種方式分配...測試與函數
int x = getX();
,只是,
getX();
這沒有任何實際用途,但我認爲這將是很好的知道。
可能嗎?
是的,這是可能的,但只能通過分析編譯的程序的字節碼,使其非常不方便。可以通過獲取類字節(通過instrumentation或其他方法)在運行時訪問字節代碼,然後使用第三方庫(如ASM,BCEL或Javassist)進行分析。
要搜索一個局部變量被分配一個函數的結果,你會想看看下面的字節碼模式:
invokevirtual/static [class:method()signature]
xstore #stack
對於int x = getX();
確切的情況下,字節碼將類似於:
invokevirtual [clazz:getX()I]
istore 1
但是當然,該clazz
是實際的類,其中getX()
位於,並且所存儲的本地變量(xstore
)的堆疊值可能會有所不同。此外,調用之前將加載方法參數,包括隱式的this
實例。總而言之,這是可能的,但並不方便,因爲了解字節碼並不是一天的體驗。
好的答案,但沒有更多的工作,搜索(和查找)字節碼只會告訴你,該函數的* some *調用的結果被分配。也許我誤解了,但我認爲OP正在詢問是否爲當前的調用找出答案。 – jerry
@jerry據我所知,這個問題沒有提到當前的調用,也沒有確定在被調用的方法本體內對當前調用的結果做了什麼。無論如何,我的答案指出必要的方向來決定必要的信息。 – Vulcan
是的,這是有用的信息,你已經得到了我的投票。我是基於我對語句的理解'如果一個函數被調用來分配或不'和['@OliCharlesworth在一個函數體內'](http://stackoverflow.com/questions/16877286/test-for-分配上帶有一個功能/ 16877414?noredirect = 1個#comment24347926_16877286)。由於OP接受了你的回答,也許我錯了。 – jerry
這只是通過分析程序的字節碼才能實現的,正如Vulcan剛剛提到的那樣。
想想看,JRE的方式。因此您需要將語句拆分爲兩部分,即
int x = getX();
。
的JRE將執行第一部分是getX
並導致類似
int methodResult = getX();
第二部分(這是JRE的一個新的聲明)是一樣的東西
int x = methodResult;
這是不是整個事情,但是我認爲這有助於理解爲什麼變量int x
與方法getX
的主體之間絕對沒有直接聯繫。
你是指從函數內部? –
你問你是否可以檢查一個函數是返回一個值還是什麼都不返回(返回void)? – MrHappyAsthma
我想他想從函數內部檢查它返回的內容是否被使用。 AFAIK這是不可能的。 – mwerschy