MartinDelophy

浅谈 node-jvm(1)

2018-5-14 by MartinDelophy


前不久,在github不小心看到了一个node-jvm 不由得惊叹,node竟然也能写出jvm,故clone了一波来看看到底是何方神圣。 地址:https://github.com/YaroslavGaponov/node-jvm

首先那肯定是看一下官方案例的,官方主要是用fibonacci.js 来new了一个jvm,然后设定日志等级,载入class文件,设定异步事件,就开始执行了。感觉很ok

那么,我们先看看它jvm地方的源码吧,首先,看到的是这句话,无用的代码暂时省略

var JVM = module.exports = function() {
    if (this instanceof JVM) {
        JVM.super_.call(this);
        THREADS.add(new Thread("main"));

        this.entryPoint = {
            className: null,
            methodName: "main"
        };
    } else {
        return new JVM();
    }
}

代码很直观,我们可以看到一开始,如果该对象是通过jvm new出来的对象就进行入 JVM.super_.call这句话中,如果不是则 new 一下返回。

这几个地方还是比较容易理解的,除了这句 JVM.super.call,我翻遍了代码,但是却没有找到这个super 方法,那么这个super_ 方法是哪里来的呢? 幸运的是,另外一句话也同样引起了我的注意

var util = require("util");
var EE = require("events").EventEmitter;
util.inherits(JVM, EE);

util.inherits指的是将 require("events").EventEmitter 方法继承到JVM中,那么super_ 从哪里来的呢,我们还是不知道,通过 这篇blog的帮助(https://www.cnblogs.com/youlechang123/p/5602335.html),我们看到了一段代码

exports.inherits = function(ctor, superCtor) {
 ctor.super_ = superCtor;
 ctor.prototype = Object.create(superCtor.prototype, {
 constructor: {
  value: ctor,
  enumerable: false,
  writable: true,
  configurable: true
 }
 });
};

这下,我恍然大悟,原来JVM.super_ 不仅这样出来,而且其中存放的是 EventEmitter 这个函数,并且在prototype中存放了 EventEmitter的原型,也就是说JVM可以获得EventEmitter中的所有方法,这也就可以解释了为什么JVM new出之后可以设定异步事件。

node-jvm 是一个比较庞大的部分,今天先分析到这里,在下一章中我会告诉大家一个有效的工具。

浅谈 node-jvm(1) | MartinDelophy
MartinDelophy

浅谈 node-jvm(1)

2018-5-14 by MartinDelophy


前不久,在github不小心看到了一个node-jvm 不由得惊叹,node竟然也能写出jvm,故clone了一波来看看到底是何方神圣。 地址:https://github.com/YaroslavGaponov/node-jvm

首先那肯定是看一下官方案例的,官方主要是用fibonacci.js 来new了一个jvm,然后设定日志等级,载入class文件,设定异步事件,就开始执行了。感觉很ok

那么,我们先看看它jvm地方的源码吧,首先,看到的是这句话,无用的代码暂时省略

var JVM = module.exports = function() {
    if (this instanceof JVM) {
        JVM.super_.call(this);
        THREADS.add(new Thread("main"));

        this.entryPoint = {
            className: null,
            methodName: "main"
        };
    } else {
        return new JVM();
    }
}

代码很直观,我们可以看到一开始,如果该对象是通过jvm new出来的对象就进行入 JVM.super_.call这句话中,如果不是则 new 一下返回。

这几个地方还是比较容易理解的,除了这句 JVM.super.call,我翻遍了代码,但是却没有找到这个super 方法,那么这个super_ 方法是哪里来的呢? 幸运的是,另外一句话也同样引起了我的注意

var util = require("util");
var EE = require("events").EventEmitter;
util.inherits(JVM, EE);

util.inherits指的是将 require("events").EventEmitter 方法继承到JVM中,那么super_ 从哪里来的呢,我们还是不知道,通过 这篇blog的帮助(https://www.cnblogs.com/youlechang123/p/5602335.html),我们看到了一段代码

exports.inherits = function(ctor, superCtor) {
 ctor.super_ = superCtor;
 ctor.prototype = Object.create(superCtor.prototype, {
 constructor: {
  value: ctor,
  enumerable: false,
  writable: true,
  configurable: true
 }
 });
};

这下,我恍然大悟,原来JVM.super_ 不仅这样出来,而且其中存放的是 EventEmitter 这个函数,并且在prototype中存放了 EventEmitter的原型,也就是说JVM可以获得EventEmitter中的所有方法,这也就可以解释了为什么JVM new出之后可以设定异步事件。

node-jvm 是一个比较庞大的部分,今天先分析到这里,在下一章中我会告诉大家一个有效的工具。