[英]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.