我的兴趣只在研究它的源代码。
关于rhino的性能,我通过这几天研究把一部分动态配置部分用rhino实现,发现只要调整jvm参数Xmx=Xms,其整体性能约为纯java的75%,我没有拿N皇后问题来测试,那个并不客观。
我应用rhino的部分并不像rhimoo这样,让javascript来做所有事情,我只是让它做一些资源配置,让用户实现我的api,而api中你可以去写javascript的方法。就好像Facebook F8那样。
这样做的目的是减少javascript带来的性能损失,代价是我需要在javascript中创建很多种java对象。我的做法是这样:
Context cx = Context.enter(); Scriptable scope = new ImporterTopLevel(cx); cx.evaluateReader(scope, getResource("mootools/mootools-server-1.2-1331.js"), "mootools-server", 1, null); cx.evaluateReader(scope, getResource(context + ".js"), context, 1, null); cx.evaluateReader(scope, getResource("bootstrap.js"), "bootstrap", 1, null); ...
用bootstrap来做一些翻译工作。
前几天因为这个不是主要矛盾,我就图省事把这些bean的getter,setter去掉,直接上public的字段。这样$extend(new klass(), options)就可以了。
后来,需要方法注入了,就把options遍历一下,从中map出$type=='function'的,然后再把class改成abstract的,最后用new klass({})就是了。
今天发现要这么乱改的类还真不少,而且这样做实在是丑陋哇
好吧,研究一下rhimoo,才发现它是用
new JavaAdapter(ServletHolder, { newInstance: function () { var servlet = new JavaAdapter(MooServletTemplate, methods); servlet.initialize(); return servlet; } });
来新建ServletHolder的,查了一下什么是JavaAdapter,好么,我后来做的遍历注入abstract就算白做了。一气做好了setter,把它们再改回正常面目。
最后发现c3p0的ComboPooledDataSource不能用JavaAdapter,原因嘛,它是final的。java可真是安全 咋办涅,计算它是不是final类有点过分了,干脆给一个参数得啦。
var $adapt = function(klass, options, f) { var instance = $chk(f) ? new klass() : new JavaAdapter(klass, options); for (var k in options) { var value = options[k]; if ($type(value) == 'function') continue; try { instance[k] = value; } catch(e1) { try { var setter = 'set' + k.capitalize(); instance[setter](value); } catch(e2) { } } } return instance; }