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 相關的知識了,如有不對請指出,多多海涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章