java的invoke詳解 Java反射到底慢在哪里?
Java反射到底慢在哪里?先陳述一下結論:java的反射是慢,但是是相對于直接調用而言,慢也的確慢了一個數(shù)量級,不過在有些場景必須使用反射,并且在反射的時候,可以用一些手段進行人工優(yōu)化再說一下java
Java反射到底慢在哪里?
先陳述一下結論:java的反射是慢,但是是相對于直接調用而言,慢也的確慢了一個數(shù)量級,不過在有些場景必須使用反射,并且在反射的時候,可以用一些手段進行人工優(yōu)化
再說一下java反射之所以有一點慢的原因
和python比起來,java是靜態(tài)語言類型,也就是說在編譯期java在編譯代碼的時候就會進行類型的強檢驗,java會在編譯期進行代碼優(yōu)化,而反射是在運行時發(fā)生的,也就是說那些類型檢查,代碼優(yōu)化的事情放在了運行時,這個自然要耗費一點時間
2.編譯期在運行時很難做一些關于反射的優(yōu)化,現(xiàn)在的編譯期還不是非常智能,知道你用這段反射代碼需要做什么事情
3.再說一下,調用實現(xiàn)過程,在反射調用過程中,執(zhí)行者叫MethodAccessor,我記得這個對象是懶加載的,也就是說有可能第一次反射調用耗時可能會更長一點,并且在調用的時候方法還要對參數(shù)數(shù)組進行包裝,可能涉及到參數(shù)類型適配,裝包拆包也有消耗,其實說到底,還是不知道具體的參數(shù)類型
java中的invoke方法?
invoke(調用)就是調用Method類代表的方法??梢詫崿F(xiàn)動態(tài)調用,例如可以動態(tài)的傳人參數(shù),可以把方法參數(shù)化。
可以把方法參數(shù)化invoke(class, method),比如Test類里有一系列名字相似的方法setValue1、setValue2等等,可以把方法名存進數(shù)組v[],然后循環(huán)里invoke(test,v[i]),就順序調用了全部setValue。