something.rb内容:
puts "中文";
试运行:
jruby something.rb
编译
jruby -S jrubyc something.rb
这样就得到了
somthing.class
用java来运行这个 .class文件
java -cp ./jruby.jar;. something
表现正常!
用jad 反编译这个something.class
d:\Files\jad\jad.exe something.class
生成了 something.jad ,这是一个.java源文件:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Source File Name: something.rb import org.jruby.Ruby; import org.jruby.RubyInstanceConfig; import org.jruby.ast.executable.AbstractScript; import org.jruby.ast.executable.RuntimeCache; import org.jruby.javasupport.util.RuntimeHelpers; import org.jruby.runtime.*; import org.jruby.runtime.builtin.IRubyObject; public class something extends AbstractScript { private static void setPosition(ThreadContext threadcontext, int i) { threadcontext.setFileAndLine("something.rb", i); } public something() { filename = "something.rb"; super.runtimeCache = new RuntimeCache(); initFromDescriptor("puts\uFFFFF\uFFFF\000\000\000\000\000\000\000\000\000\000\000\000\001\001"); setEncoding(0, "ASCII-8BIT"); setByteList(0, "\uFFD6\uFFD0\uFFCE\uFFC4", getEncoding0()); } public static IRubyObject __file__(something something1, ThreadContext threadcontext, IRubyObject irubyobject, IRubyObject airubyobject[], Block block) { return something1.getCallSite0().call(threadcontext, irubyobject, irubyobject, something1.getString0(threadcontext.runtime, 64)); } public IRubyObject __file__(ThreadContext threadcontext, IRubyObject irubyobject, IRubyObject airubyobject[], Block block) { return __file__(this, threadcontext, irubyobject, airubyobject, block); } public IRubyObject load(ThreadContext threadcontext, IRubyObject irubyobject, IRubyObject airubyobject[], Block block) { RuntimeHelpers.preLoad(threadcontext, ",0,0,-2"); RuntimeHelpers.postLoad(threadcontext); return __file__(this, threadcontext, irubyobject, airubyobject, block); RuntimeHelpers.postLoad(threadcontext); throw ; } public static void main(String args[]) { something something1; RubyInstanceConfig rubyinstanceconfig; something1 = new something(); String s; something1.setFilename(s = something.getClassLoader().getResource("something.class").toString()); rubyinstanceconfig = new RubyInstanceConfig(); rubyinstanceconfig.setArgv(args); rubyinstanceconfig.setScriptFileName(s); Ruby ruby; something1.load((ruby = Ruby.newInstance(rubyinstanceconfig)).getCurrentContext(), ruby.getTopSelf(), IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); } }
可以看出来,即使编译成.class文件 ,依然是解释执行的.
puts "中文" 代码源文件都还在里面, 只是中文被编译转义了.
##