知识背景:
我们大家都听过 Java 常量池,其实他里面就存了 class 相关信息,比如 这个类的包名,那么 当 执行到 这一句的时候,要加载类的时候,
我们就可以 去做我们自己事,比如 调用js 处理这些事情,而当一些计算型的事情我们同样可以这么做,也就是 说我们 只要,把Java基础库写完,就可以用node 跑 class
这思想就是指令解析,有点类似汇编,这里我贴一点代码理解下:
这是一段比较有趣的指令解析,就是从常量池里拿出 className,然后去load class or js 去处理一些事,看到这里也许你也明白了,为什么Java内部类 会生成一个独立的class
文件
Frame.prototype.putstatic = function(done) {
var idx = this._read16();
var className = this._cp[this._cp[this._cp[idx].class_index].name_index].bytes;
var fieldName = this._cp[this._cp[this._cp[idx].name_and_type_index].name_index].bytes;
CLASSES.setStaticField(className, fieldName, this._stack.pop());
return done();
}
Frame.prototype.invokestatic = function(done) {
var self = this;
var idx = this._read16();
var className = this._cp[this._cp[this._cp[idx].class_index].name_index].bytes;
var methodName = this._cp[this._cp[this._cp[idx].name_and_type_index].name_index].bytes;
var signature = Signature.parse(this._cp[this._cp[this._cp[idx].name_and_type_index].signature_index].bytes);
var args = [];
for (var i=0; i<signature.IN.length; i++) {
if (!signature.IN[i].isArray && ["long", "double"].indexOf(signature.IN[i].type) !== -1) {
args.unshift("");
args.unshift(this._stack.pop());
} else {
args.unshift(this._stack.pop());
}
}
var method = CLASSES.getStaticMethod(className, methodName, signature);
if (method instanceof Frame) {
method.setPid(self._pid);
method.run(args, function(res) {
if (signature.OUT.length != 0) {
self._stack.push(res);
}
return done();
});
} else {
var res = method.apply(null, args);
if (signature.OUT.length != 0) {
self._stack.push(res);
}
return done();
}
}
这里就是 判断去load class 还是 js,node 就像是个翻译器
Classes.prototype.getClass = function(className) {
var ca = this.classes[className];
if (ca) {
return ca;
}
for(var i=0; i<this.paths.length; i++) {
var fileName = util.format("%s/%s", this.paths[i], className);
if (fs.existsSync(fileName + ".js")) {
return this.loadJSFile(fileName + ".js");
}
if(fs.existsSync(fileName + ".class")) {
return this.loadClassFile(fileName + ".class");
}
}
throw new Error(util.format("Implementation of the %s class is not found.", className));
};
这是通过 javap 生成的指令集
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class Clazz
3: dup
4: invokespecial #3 // Method Clazz."<init>":()V
7: astore_1
8: aload_1
9: getfield #4 // Field Clazz.test:LClazz$Test;
12: ldc #5 // String print from nested class
14: invokevirtual #6 // Method Clazz$Test.print:(Ljava/la
ng/String;)V
17: return
}