大家好,今天小编关注到一个比较有意思的话题,就是关于c语言调用java的问题,于是小编就整理了3个相关介绍c语言调用j***a的解答,让我们一起看看吧。

  1. 如何用java调用c编写成的DLL?
  2. jvm:java代码是如何运行的?
  3. JAVA虚拟机中是如何加载JAVA类的?

如何用j***a调用c编写成的DLL?

谢邀,远程方法调用的思路是对的,就是先用C#写一个WCF调用该库,然后J***a调用WCF。如果你的库需要返回的数据只是基本类型的,不会很难。如果你需要返回一个自定义类,那么唯一的出路就是放弃。

c语言调用java-C语言调用java server 端口关闭
(图片来源网络,侵删)

jvm:j***a代码是如何运行的?

一、J***a代码运行流程

A、基本流程

c语言调用java-C语言调用java server 端口关闭
(图片来源网络,侵删)

一个J***a项目,包含很多的「.j***a」为后缀的源代码文件,除去IDE里直接执行调试,一般来说,都是把代码打成jar包,或者是war包,最后将打包好的jar包或是war包传到线上服务器部署。

部署方式很多,最基本的一种是通过Tomcat容器来部署,也可以是自己手动通过j***a命令来运行一个jar包中的代码。

c语言调用java-C语言调用java server 端口关闭
(图片来源网络,侵删)

B、编译

上述流程中有一个非常关键的点,「编译」

在j***a代码打包的过程中,一般会把源代码编译成「.class」后缀的字节码文件。只有字节码文件class才能被JVM识别并解释运行。

C、JVM进程

对于编译好的class字节码,需要使用诸如j***a -jar之类的命令来运行写好的代码;一旦使用j***a命令,实际上此时就会启动一个JVM进程。

JVM进程会负责运行这些class字节码文件,也就相当于负责运行我们写好的代码。

D、类加载

JVM要运行这些class字节码文件中的代码,会***用类加载器把编译好的class字节码文件加载进JVM内存中

E、解释执行

最后JVM会基于自己的字节码执行引擎,来执行加载到内存里的类。当JVM需要哪个类时,会使用类加载器来加载对应的类。

从虚拟机的视角来看,执行j***a代码首先需要将它编译而成的class文件加载到j***a虚拟机中。加载后的j***a类会被存放在方法区中。实际运行时,虚拟机会执行方法区的代码。

在运行过程中,每当调用进入一个j***a方法,j***a虚拟机会在当前线程的j***a方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且j***a虚拟机不要求栈帧在内存空间里连续分布。

在hotspot里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(JIT),即将一个方法包含的所有字节码编译成机器码后再执行。

J***A虚拟机中是如何加载J***A类的?

我们平时都知道通过j***ac命令将

.j***a

文件编译成

.class

文件,之后这个class文件就可以“被运行”了,但是我们需要搞清楚的是这个class文件在虚拟机中究竟是怎么玩的。

要想具体搞清楚j***a类是如何加载的J***a虚拟机中,我们需要搞清楚以下几个问题:

  • 一个J***a类什么时候开始被加载?

  • 加载J***a类的过程是怎样的?

一个J***a类从被加载到JVM内存中到这个类被卸载,主要包含以下七个步骤的生命周期。

一个J***a类什么时候开始被加载?

J***a虚拟机并没有规定在什么时候需要加载J***a类,但是对于J***a类的初始化却有明确的规定,有且只有以下5中情况时候便会立即触发类的“初始化”动作:

  1. 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有初始化,则需要先触发其初始化,代码示例如下:

  2. 使用

    j***a.lang.reflect

    包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化,代码示例如下:

  3. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。这个很好理解,就是当一个子类遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果父类还没有初始化,则先初始化父类。

  4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

  5. 当使用JDK1.7的动态语言支持时,如果一个j***a.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。这块属于动态加载的范畴,本质上还是需要需要new、getstatic、putstatic或invokestatic这4条字节码指令。

加载J***a类的过程是怎样的?

知道了类被加载的条件后,我们需要知道一个J***a类通过怎样的过程被加载到J***a虚拟机中去了。

这个过程其实就是把一个

.class

文件中的j***a类相关信息加载到内存中,通过验证、准备、解析等阶段,最终生成一个存在于J***a虚拟机内存中的

j***a.lang.Class

对象。

这里面涉及到的知识点比较多:

  • 如何验证一个

    .class

    文件是符合J***a虚拟机规范的?

  • 准备阶段都做哪些事情?

  • 类加载机制是怎样的?

  • 什么是双亲委派模型?

  • 加载完的类存储在J***a虚拟机的什么内存区域?

  • 加载的类GC可以回收吗?如果可以回收需要满足什么样的条件才可以回收一个类?

推荐大家一定要阅读《深入理解J***a虚拟机》这本J***a程序员必读书籍!并且不只是读一遍,要不停的读,不停的品!


以上就是我个人对“J***A虚拟机中是如何加载J***A类的?”这个问题的一些解答,这里只是给大家开个一个头,需要大家再继续深耕下去。

我是【j***a架构设计】,关注我,持续为您提供J***a领域优质内容!

到此,以上就是小编对于c语言调用j***a的问题就介绍到这了,希望介绍关于c语言调用j***a的3点解答对大家有用。