`
jnn
  • 浏览: 288266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 的动态链接

    博客分类:
  • Java
阅读更多
 JAVA和C/C++的区别有很多,你知道Java程序需要链接吗?

Java 语言与C/C++ 在语法上很相似,但是由于它是伴随着互连网络成长起来的,为了迎合异构主机构架以及支持安全的软件分发,逐步发展成为一个语言平台。

我们知道如果用C/C++写程序,从源代码到可执行程序需要经历编译,链接两个步骤。但是用Java语言写程序则不同,你只需要将你的源代码编译成字节码 就可以了,字节代码通过Java虚机来运行。要概括上面两种语言的这一不同之处,我们可以说Java是通过Java解释来执行的,C/C++是通过编译来 执行的。

如果你用C/C++来写一个通讯程序完成Intel/Windows 到Sparcs/Solarise两台计算机之间的通讯功能,你需要经历痛苦编译和链接。也许你会使用标准C编译器,使用其提供的最基本的C语言API, 再加上若干的#if...#define 写出一个在上面两个计算机都可以编译链接成功的源程序,这意味着所有标准C语言API之上的工作都要由你一个人来完成。也许你会在标准的C语言API上使 用C++来封装一个精巧的类库,或者使用别人的类库来屏蔽底层OS API的不同,并在这样类库之上写出一个漂亮的源程序。

可见使用C/C++要完成上面的工作可不容易,你除了要为你写的源文件和不同的编译器的语法规则做斗争,将我们的源程序编译成为中间件文件;同时还需要为 你所使用第三方的类库文件与链接程序做斗争如果你源程序和第三方库不是采用一个编译器编译出来的,哪你还得找到第三方类库的源代码,或者是换一个编译器来 编译你的源程序。基本上要经历好几轮的修改、编译、链接,才能让的源程序进入运行状态。

如果你采用Java来写这个程序则轻松了很多。你可以使用JDK所提供的API,也可以使用第三方的Java类库。你的源程序可以很轻松的编译成为字节 码,这些只是一个一个的程序块,如果想让程序运行起来,需要Java虚机在运行时动态加载(RunTime Link)其所需要的资源,使之成为一个可以运行的程序。Java语言这样做的好处显而易见,首先源程序只需要编译一次,成为独立与具体机器指令的中间文 件,然后这些字节码就可以在任意的标准的Java虚机上运行。

说了这些众所周知的C/C++与Java语言在编译运行的不同,对我们有什么启发呢?笔者先后做过C/C++和Java的开发,开始并没有领会其中的真 谛,直到前几个月深入接触到了class loader才真正体会到Java这一RunTime Link 的神奇魅力,可以让我们完成很多静态链接所无法完成的任务。

如果我们拿到了一个C/C++编译完成的可执行程序,如果这个时候你想为这个可执行程序添加一些可以扩展的功能,如果你这时没有源代码,那你等待你的可能 是处理复杂的汇编指令,或者采用钩子函数去替换可执行程序调用的API。如果你拿到的是JAVA程序,你可以像修改C/C++可执行程序一样修改Java 的目标文件字节码的方式来实现,但是我们可以通过一种更优美的方式来修改或者扩这Java程序的运行时的特性。

因为Java是解释执行的,其目标文件字节码是一个非常小的,并且是很容易理解的指令集合。Java虚机为了能够让这些短小的指令集合能够运行起来,这就 是我们前面提到的C/C++程序链接(Link)所做的事情(链接就是要把程序运行所需要API以及相关的资源文件,都重新进行组织生成可以单独运行的程 序)。由于Java程序是运行在Java虚机之上的,自然的Java程序在运行过程中所需要加载的类文件或其他的资源文件都需要Java虚机来负责加载, 并提供管理和调用。写过Java程序的朋友也许经常会遇到这样一个问题吧,就是Exception in thread "main" java.lang.NoClassDefFoundError:XXX,一般遇到这个问题的时候,基本上都是因为你的CLASSPATH没有设置正确, 设置正确的CLASSPATH,就可以解决这个问题,但是有多少人会去深究其中的奥秘呢?

首先我们来究其原因,我们知道Java虚机在运行的过程中是通过class loader动态读取Class文件,并将加载后Class的字节码交付给Java虚机执行。这个很容易理解,Java虚机不可能预先知道任意一个 Java程序需要的Class文件,所以Java虚机需要通过某种手段来实现Class文件的正常读写,上面的Exception就是Java虚机在加载 Class文件出现的。

知道这一原理之后,我们如果想在不修改源程序的基础上扩展Java第三方程序库的功能,或者说我们想改变某个Class文件的指令结构。这样我们就很容易 得实现让第三方程序实现一个特定的接口,或者是暴露给我一个原来只能内部调用的方法。我们可以通过调用一些第三方的程序库(BCEL,ASM等)来实现对 应字节码的修改,通过class loader实现将修改后的字节码提交给JVM,然后链接执行。

See, It is simple and easy.

在下面的几篇文章里,我们将详细看到几个如果通过处理Java字节码,来实现对第三方程序库修改的例子。

未完待续

分享到:
评论

相关推荐

    哈工大 LTP java动态链接库 64位可用

    标题中的“哈工大LTP java动态链接库 64位可用”指的是哈尔滨工业大学语言技术平台(LTP,Language Technology Platform)为Java开发提供的适用于64位操作系统的动态链接库。LTP是一款开源的自然语言处理工具包,它...

    哈工大 LTP java动态链接库 64位的可用

    【哈工大LTP Java动态链接库64位详解】 哈工大语言技术平台(LTP,Language Technology Platform)是哈尔滨工业大学计算机学院自然语言处理研究组开发的一套开源的中文自然语言处理工具包。该平台提供了丰富的语言...

    Java动态链接与验证

    Java动态链接与验证是Java虚拟机(JVM)在执行Java程序时的关键步骤,它们确保了程序的安全性和稳定性。在Java执行过程中,这个过程被分为五个主要组件:评价、决议、加载、验证和编译。这些组件各自都有其特定的...

    哈工大LTP java动态链接库 64位可用

    Java动态链接库(DLL)是Windows操作系统中的一种共享库,它包含了可被多个程序同时调用的函数和资源,是软件运行的关键组成部分。 在这个特定的压缩包中,“哈工大LTP java动态链接库 64位可用”,意味着这些库...

    java调用动态链接库实例 java调用动态链接库实例 java调用动态链接库实例

    在Java编程中,有时我们需要利用已有的C或C++库,这些库通常以动态链接库(Dynamic Link Library, DLL在Windows上,Shared Object, SO在Linux上)的形式存在。Java本身并不直接支持调用原生代码,但它通过Java ...

    java程序中加载动态链接库文件

    ### Java程序中加载动态链接库文件 #### 一、引言 在开发Java应用程序时,有时需要调用一些底层硬件接口或执行特定平台的操作,这些功能通常无法仅通过纯Java代码实现。这时,就需要借助于Java Native Interface ...

    java调用动态链接库例程(测试通过)及库包 jna4.3

    然而,有时我们需要在Java程序中调用操作系统底层的函数,这通常是由动态链接库(DLL)提供的。Java Native Access (JNA) 是一个Java库,它允许Java代码直接调用本机库函数,无需编写JNI(Java Native Interface)...

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

    arm64位系统jdk1.8版opencv动态库opencv-454.jar和libopencv-java454.so

    其次,`libopencv_java454.so`是一个动态链接库文件,它是OpenCV与Java应用程序交互的关键。在Linux系统中,`.so`文件是共享对象(Shared Object),相当于Windows系统中的DLL文件。这个库使得Java应用程序能够通过...

    swig--在java、C#中调用c++写的DLL(以vs2012配置为例)

    在本案例中,我们将探讨如何利用SWIG在Java和C#中调用由C++编写的动态链接库(DLL)。VS2012是Visual Studio 2012的缩写,是一款由Microsoft提供的集成开发环境,用于创建Windows应用、Web应用、移动应用等。 首先,...

    java调用动态链接库

    java调用动态链接库

    java控制twain设备需要的动态链接库文件

    java控制twain设备需要的动态链接库文件,文件名: jtwain.dll

    java调用C++动态链接库dll接口

    本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...

    java调用C的动态链接库

    在Java编程环境中,有时我们需要利用C语言编写的高效或特定功能的库,这时可以借助Java Native Interface (JNI) 来实现Java调用C的动态链接库。以下将详细讲解这一技术。 1. Java Native Interface (JNI) JNI是...

    java调用c++动态链接库输出

    当Java需要调用C++编写的动态链接库(DLL)时,可以通过Java Native Interface (JNI) 或 Java Access Bridge (JNA) 来实现。本文将详细介绍如何创建C++动态链接库,并讨论如何让Java应用程序调用这些库。 1. 创建...

    Java动态生成PDF源码

    在IT行业中,生成PDF文档是一项...总的来说,Java动态生成PDF涉及多个技术点,包括PDF库的选择、文档结构的设计、内容的添加等。通过学习和实践,开发者可以根据具体需求灵活运用这些库,创建出满足业务要求的PDF文件。

    Java 动态加载jar文件示例

    下面我们将深入探讨Java动态加载jar文件的原理和实践方法。 首先,我们需要理解Java的类加载机制。Java中的类是由类加载器(ClassLoader)负责加载的。默认情况下,Java虚拟机(JVM)提供了三个内置的类加载器:...

    JAVA手机程序入门2

    #### 深入理解Java动态链接 Java的动态链接特性是其能够实现跨平台、灵活部署的重要原因。这背后依赖于Java虚拟机(JVM)的类加载机制。当Java应用程序启动时,JVM会按需加载类,而不是一次性加载所有类。这种延迟...

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    然后再在 Java 中载进这个适配器 dll/so ,再编写 Java?? native 函数作为 dll 中函数的代理。 经过 2 个繁琐的步骤才能在 Java 中调用本地代码。 因此,很少有 Java 程序员愿意编写调用 dll/.so 库中的原生函数的 ...

Global site tag (gtag.js) - Google Analytics