2013-06-01 74 views
4

我在想,如果有一個測試或知道如果一個函數被調用,以分配或不,我的意思是告訴之間的區別的某種方式分配...測試與函數

int x = getX(); 

,只是,

getX(); 

這沒有任何實際用途,但我認爲這將是很好的知道。

可能嗎?

+0

你是指從函數內部? –

+0

你問你是否可以檢查一個函數是返回一個值還是什麼都不返回(返回void)? – MrHappyAsthma

+0

我想他想從函數內部檢查它返回的內容是否被使用。 AFAIK這是不可能的。 – mwerschy

回答

6

是的,這是可能的,但只能通過分析編譯的程序的字節碼,使其非常不方便。可以通過獲取類字節(通過instrumentation或其他方法)在運行時訪問字節代碼,然後使用第三方庫(如ASMBCELJavassist)進行分析。

要搜索一個局部變量被分配一個函數的結果,你會想看看下面的字節碼模式:

invokevirtual/static [class:method()signature] 
xstore #stack 

對於int x = getX();確切的情況下,字節碼將類似於:

invokevirtual [clazz:getX()I] 
istore 1 

但是當然,該clazz是實際的類,其中getX()位於,並且所存儲的本地變量(xstore)的堆疊值可能會有所不同。此外,調用之前將加載方法參數,包括隱式的this實例。總而言之,這是可能的,但並不方便,因爲了解字節碼並不是一天的體驗。

+0

好的答案,但沒有更多的工作,搜索(和查找)字節碼只會告訴你,該函數的* some *調用的結果被分配。也許我誤解了,但我認爲OP正在詢問是否爲當前的調用找出答案。 – jerry

+0

@jerry據我所知,這個問題沒有提到當前的調用,也沒有確定在被調用的方法本體內對當前調用的結果做了什麼。無論如何,我的答案指出必要的方向來決定必要的信息。 – Vulcan

+0

是的,這是有用的信息,你已經得到了我的投票。我是基於我對語句的理解'如果一個函數被調用來分配或不'和['@OliCharlesworth在一個函數體內'](http://stackoverflow.com/questions/16877286/test-for-分配上帶有一個功能/ 16877414?noredirect = 1個#comment24347926_16877286)。由於OP接受了你的回答,也許我錯了。 – jerry

0

這只是通過分析程序的字節碼才能實現的,正如Vulcan剛剛提到的那樣。

想想看,JRE的方式。因此您需要將語句拆分爲兩部分,即

int x = getX(); 

的JRE將執行第一部分是getX並導致類似

int methodResult = getX(); 

第二部分(這是JRE的一個新的聲明)是一樣的東西

int x = methodResult; 

這是不是整個事情,但是我認爲這有助於理解爲什麼變量int x與方法getX的主體之間絕對沒有直接聯繫。