簡體   English   中英

通過反射調用實例方法,好像它是靜態的

[英]Invoking instance method as if it was static through reflection

從簡化的角度來看,.Net中的所有方法實際上都是靜態的。 通過隱式地將this引用傳遞給第一個方法參數來調用實例方法。 因此,可以在不實際提供正確實例的情況下調用實例方法,使其行為類似於靜態方法。 例如,可以通過動態發出call OpCode而不是callvirt來調用string.Equals(string s)null.Equals(null)callvirt編寫相應的IL代碼。 我記得,如果在運行時添加代碼,可能會遇到這種情況。 如果就沒有問題, this是不是方法體中使用。
這件事證明了.Net中的方法實際上是靜態的。 我想知道Java中是否有類似的技巧。 我已經仔細研究過Method.invoke() -檢查是否沒有正確的實例就不會調用實例方法是非常徹底的,並且為空實例保證了NullPointerException 主要是因為Java中的所有方法都是虛擬的,對於虛擬調用,需要正確的類型。
因此,是否有任何技巧可以像在Java中那樣將其實例化為靜態方法(可能是由於某種優化,例如,如果運行時僅存在一個方法實現,則可以將虛擬調用更改為非虛擬調用)? 還是由於可能存在實實例方法而被禁止(每個類型的實例都具有該方法的自身方法主體,而不在它們之間共享)?

當然不是來自Java代碼,不是。

如果您手動滾動字節碼,那么也許可以使用invokestatic操作來調用實例方法,但是這樣做的結果未在JVM規范中定義。 不同的JVM實現可以並且可能會以不同的方式處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM