当前位置: 首页 > news >正文

【JavaGuide学习笔记】什么,Java中 native 也是一个关键字?

博主之前从来没有了解过这个关键字,在 JavaGuide 的 Object 类中偶然发现,于是便在此补充了解一下

📕对应位置:【JavaGuide ->Java基础常见面试题总结(中)->Object】

来源

native关键字是Java编程语言的标准组成部分,源于Java Native Interface (JNI) 机制。JNI 是Java平台的一个框架,允许Java代码与用其他语言(如C、C++或汇编)编写的本地应用程序和库进行交互。native关键字最早出现在Java 1.0版本中,用于支持Java虚拟机(JVM)与底层操作系统或硬件的集成。

这使得Java程序能够调用非Java代码,从而处理一些Java本身不擅长或无法高效处理的低级操作,例如直接访问硬件、调用系统API或优化性能关键的部分。

同胞(相关关键字)

出乎意料地,它的好朋友我们倒是见得不少:

在Java中,native属于方法修饰符(method modifier)的一员,与其他修饰符共同用于定义方法的特性,类似关键字包括:

  • abstract:用于声明抽象方法,没有方法体,必须在子类中实现。
  • static:声明静态方法,属于类而非实例,可直接通过类名调用。
  • final:声明方法不可被子类重写。
  • synchronized:用于线程同步,确保方法在多线程环境中安全执行。
  • strictfp:确保浮点运算严格遵守IEEE 754标准(较少使用)。
    这些关键字都是方法或类的修饰符,但native独特之处在于它表示方法实现不在Java代码中,而在本地代码库中。

作用

native关键字的主要作用是声明一个方法为“本地方法”(native method),即方法的实现不是用Java语言编写的,而是用其他编程语言(如C或C++)在本地动态链接库(DLL或SO文件)中实现。使用native时:

  • 方法声明中只需写方法签名(包括返回类型、方法名和参数),但没有方法体(即没有大括号{}内的代码)。

  • JVM在运行时会通过JNI加载并调用相应的本地代码。

  • 常见应用场景:

    • 访问系统资源:如文件I/O、网络套接字或图形界面(例如Java的标准库中许多方法如Object类的hashCode()clone()等就是native的)。
    • 性能优化:对于计算密集型任务,本地代码可能更快。
    • 集成遗留系统:调用现有的C/C++库。

示例

public class NativeExample {// 声明一个native方法public native void nativeMethod(String param);// 在静态块中加载本地库static {System.loadLibrary("nativeLib"); // 加载名为libnativeLib.so或nativeLib.dll的库}
}

在实际使用中,需要用C/C++编写对应的本地实现,并生成头文件(使用javah工具或现代的javac -h)来匹配Java方法签名。

注意事项

  • 使用native会降低Java的平台无关性,因为本地代码依赖于特定操作系统和架构。
  • 潜在风险:本地代码可能引入内存泄漏或安全漏洞,需要小心处理。
  • Object类中,如getClass()hashCode()equals()等方法的部分实现使用了native,以确保高效性和与JVM的紧密集成。
http://www.dtcms.com/a/390027.html

相关文章:

  • 【LWIP】STM32F429 + LWIP + DP83848 热插拔问题总结
  • RGWRados::Object::Write::_do_write_meta()
  • Shopify 集合页改造:增加 Banner 图片 + 点击加载更多功能
  • 泛函 Φ(u) = ∫[(u″)² + u² + 2f(x)u]dx − (u′(0))² 在 u(0)=u(1) 下的驻点方程与边界条件
  • JAVA高频面试题汇总:Java+ 并发 +Spring+MySQL+ 分布式 +Redis+ 算法 +JVM 等
  • 构建与运营“爬虫 IP 代理池”的方法论
  • 【文献笔记】Point Transformer
  • Linux | i.MX6ULL Modbus 移植和使用(第二十一章)
  • 几种微前端框架的沙箱策略
  • 黑盒测试:测试用例设计之边界值设计方法(边界值分析法)(上点、离点、内点)健壮性测试、单缺陷假设理论
  • 【题解】P1548 [NOIP 1997 普及组] 棋盘问题
  • scala中for推导式详细讲解
  • React学习 ---- 基础知识学习
  • C语言实现MATLAB中的Fir1带通滤波器
  • 微信小程序开发教程(十七)
  • 9月18日星期四今日早报简报微语报早读
  • SqlSugar 问题记录
  • 记一次宝塔+nginx+php8+thinkphp8多应用下某个应用报错404的问题 - nginx、php日志全无 - 无法追踪
  • Windows Server远程桌面(RDP)安全优化
  • 工具链过于分散会导致哪些问题
  • 【RAG】Youtu-GraphRAG
  • 惠普LaserJet Pro M203dn黑白激光打印机双面卡纸维修一例
  • 专题二 二叉树中的深度优先搜索
  • Git 多人协作(1)
  • 设计模式第三章(迭代器模式)
  • 网络原理(4):HTTP协议 -- HTTP请求 -- 首行(请求方法)
  • 密钥下发服务中心:双重验证 + 实时监控的轻量级密钥管理解决方案
  • 硬件 - RK3588部分(4) - 原理图 - RK806
  • Sass开发【三】
  • 百度之星2025(第二场)