JAVA—随笔之Native关键字

版权声明:本文为博主原创文章,转载请注明作者和出处。 https://blog.csdn.net/Meet_Deer/article/details/83180697

先看看 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 相关的知识了,如有不对请指出,多多海涵。

猜你喜欢

转载自blog.csdn.net/Meet_Deer/article/details/83180697
今日推荐