JAVA—隨筆之Native關鍵字
先看看 Native:
native 是一個計算機函式(Java語言),而被 native 所修飾的方法,我們就稱為 Native Method。在 java.lang 包下的 Object.class 裡面我們就可以發現很多是 native 所修飾的方法。
package java.lang;
public class Object {
private static native void registerNatives();
static {}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {}
public final void wait() throws InterruptedException {}
protected void finalize() throws Throwable { }
}
什麼是 Native Method:
Native Method — —原生方法(本地方法),是一個 java 呼叫非 java 程式碼的介面。
意思就是:Native Method 雖然寫在 java 程式碼裡,但我可以使用非 java 的語言去實現該方法(C、C++)。
原文:"A native method is a Java method whose implementation is provided by non-java code.
Native Method 看起來像一個抽象方法(Abstract Method),但不等同於抽象方法(下面會說),宣告時只需要方法簽名即可,無需方法體。
例子:
public native int hashCode();
為什麼會有 Native Method:
人無完人,金無足赤。Java 也不是十全十美的,速度上比起C、C++要慢之外,Java 無法直接訪問到作業系統底層(系統硬體等等),而 Native Method 就是來幫助擴充套件 Java 程式的,這也使得 Java 程式能夠超越 Java 執行時的界限了。
native 關鍵字與 Java 其他關鍵字連用:
native 關鍵字可以與 java 中其他關鍵字一起使用,abstract 除外,因為 native 只是表明該方法是具有實現體的,只是不一定用 java 而已,但 abstract 是表明該方法無實現體。除此之外在於其他關鍵字連用時,意義是沒有什麼差別的。
例如:
native static 連用:則該方法可以在不產生例項時直接呼叫。
native synchronized 連用:JVM 在執行這個方法提前同樣會執行同步鎖。
Native Method 的返回值:
Native Method 可以返回任何 java 型別,同樣包括非基本資料型別。對於接收到一個非基本型別時(Object),該方法是可以訪問這些 Object 內部的,但這將需要依賴你所訪問的 java 類的實現。
Native Method 同樣可以進行對異常的控制。其對異常的控制與 java 很類似。
Native Method 會有什麼影響:
Native Method 的存在並不會對其他呼叫者產生任何影響,而且這些呼叫的方法都並不知道自己呼叫的是一個 Native Method,這些都是由 JVM 來控制的。
關於 Native Method 的重寫:
當一個類(Class)中包含了 Native Method 被其他類繼承的時候,子類是可以用 java 重寫該 Native Method 的。但父類中 Native Method 被 final 修飾之後,則不能被重寫。
JVM與Native Method
在一個類(Class)第一次被使用到的時候,該類的位元組碼會被載入到記憶體,且只會載入一次,同時在載入位元組碼的入口會維持著一個關於該類所有方法的描述符的List,其包含的資訊:方法程式碼存於何處、有哪些引數、方法的修飾符等等。
當出現 Native Method時,該描述符塊將有一個指向該方法的實現的指標。這些實現在一些 DLL 檔案中,但它們會被作業系統載入到 java 程式的地址空間。當 包含Native Method 的類被載入時,其相關的 DLL 是不會被載入的,指向方法實現的指標也不會被設定。只有當 Native Method 被呼叫之前,才會載入 DLL,這是通過 java.system.loadLibrary() 實現的。
~~OK,以上就是對 Native 相關的知識了,如有不對請指出,多多海涵。