jruby java_在java语言中执行jruby

ruby一种动态语言,而JRuby是纯java实现的ruby语言。JRuby使用ruby语法开发。不仅可以使用ruby类库,同时也可以使用java基础类库和第三方jar包。

举一个hello world的例子:

ruby语言

Ruby代码 icon_star.png

spinner.gifputs"hello world"puts "hello world"

jruby语言

Ruby代码 icon_star.png

spinner.gifinclude Java

java.lang.System.out.println "hello world"include Java

java.lang.System.out.println "hello world"

使用jruby开发 swing

Java代码 icon_star.png

spinner.gifinclude Java

importjava.lang.Boolean

importjava.lang.System

importjavax.swing.JFrame

importjavax.swing.JButton

importjava.awt.Dimension

frame=JFrame.new

frame.set_default_close_operation JFrame::EXIT_ON_CLOSE

button = JButton.new("button")

button.add_action_listener do|evt|

javax.swing.JOptionPane.show_message_dialog(nil, <

you click me #{System.identity_hash_code evt}

EOF

end

frame.get_content_pane.add button

frame.set_minimum_size Dimension.new(200,200)

frame.set_location_relative_to nil

frame.set_visible trueinclude Java

import java.lang.Boolean

import java.lang.System

import javax.swing.JFrame

import javax.swing.JButton

import java.awt.Dimension

frame=JFrame.new

frame.set_default_close_operation JFrame::EXIT_ON_CLOSE

button = JButton.new("button")

button.add_action_listener do |evt|

javax.swing.JOptionPane.show_message_dialog(nil, <

you click me #{System.identity_hash_code evt}

EOF

end

frame.get_content_pane.add button

frame.set_minimum_size Dimension.new(200, 200)

frame.set_location_relative_to nil

frame.set_visible true

运行截图

93e36e65061179fa6e66c536c20b5f09.png

364dba4ce55a1719faf6e5a5457f5311.png

swing为了监听事件通常要写很多匿名内部类,我觉得这是java语言的弱点。ruby有block和闭包,那么使用jruby开发swing就能解决这个问题。

好吧,让我们切入正题。有时候我们需要利用不同语言的特性解决不同的问题,比如用java语言做开发,但有一个生成静态页面的模块用jruby(我感觉在模板引擎这块ruby远远要比java做的好,即使java有freemarker和velocity),我需要在合适的时机通过java调用jruby写的模块来生成页面。

问题来了,怎样通过java调用jruby写的程序呢?

有三种方式可以解决这个问题(参考 RedBridge)

1  Embed Core

需要 jruby.jar

Java代码 icon_star.png

spinner.gifString jrubyCode="puts 'hello world'";

ScriptingContainer container = newScriptingContainer();

container.runScriptlet(jrubyCode);String jrubyCode="puts 'hello world'";

ScriptingContainer container = new ScriptingContainer();

container.runScriptlet(jrubyCode);

2  jsr223 Java Script Engine

如果jdk版本低于1.6需要 jsr223 api和 jruby.jar

或者jdk1.6 和jruby.jar

Java代码 icon_star.png

spinner.gifString jrubyCode="puts 'hello world'";

ScriptEngineManager manager = newScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("jruby");

engine.eval(jrubyCode);String jrubyCode="puts 'hello world'";

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("jruby");

engine.eval(jrubyCode);

利用jsr223 Script Engine 可以调用许多动态语言,其中jdk原生还支持JavaScript(第一次在JavaScript中调用java类感觉有些激动)

Java代码 icon_star.png

spinner.gifString jrubyCode="puts 'hello world'";

BSFManager.registerScriptingEngine("jruby","org.jruby.embed.bsf.JRubyEngine",newString[] {"rb"});

BSFManager manager = newBSFManager();

manager.exec("jruby","

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值