2013-02-14 66 views
1

我用一個小的JRuby腳本http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html測試invokedynamic:JRuby的java.lang.ClassCastException

class ADuck 
    def quack() 
     puts "quack A"; 
    end 
end 

class BDuck 
    def quack() 
     puts "quack B"; 
    end 
end 

def quack_it(duck) 
    duck.quack 
end 

a = ADuck.new 
b = BDuck.new 
quack_it(a) 
quack_it(b) 

但是,當我使用JRuby編譯成Java類文件,然後嘗試執行它,我得到以下異常:

Java HotSpot(TM) 64-Bit Server VM warning: Use -XX:+UnlockDiagnosticVMOptions be 
fore EnableInvokeDynamic flag 
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot 
be cast to java.lang.invoke.SwitchPoint 
     at  org.jruby.runtime.invokedynamic.InvokeDynamicSupport.constantFallback 
(InvokeDynamicSupport.java:659) 
     at duck_typing.__file__(duck_typing.rb:22) 
     at duck_typing.load(duck_typing.rb) 
     at duck_typing.main(duck_typing.rb) 

我的系統:JDK 1.7.0_09 64位的Windows 7 64位,JRuby的1.7.2

使用COMMANDLINES:

jruby -Xcompile.invokedynamic=true -S jrubyc duck_typing.rb 
java -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic -cp .;jruby-complete-1.7.2.jar duck_typing 

前一段時間我在linux機器上測試了它,結果和Windows jdk8相同。 隨着JDK8的工作,但給了我在另一個項目中使用類文件的問題。

有沒有人有一個idee如何解決它? 如何在Java 7上使用JRuby和indy?

回答

0

除JRuby便利參數--server外,所有JVM運行時 參數都使用-J選項,後跟特定的JVM設置。 例如:

堆空間設置:jruby的-J-X

JRuby運行時設置:jruby的-J-d

在所有以下部分中描述的設置是JVM設置。

https://github.com/jruby/jruby/wiki/PerformanceTuning

試試這個,而不是

jruby -J-Xcompile.invokedynamic=true -S jrubyc duck_typing.rb 
+0

對不起,這並沒有爲我工作。 Java給了我和上面一樣的異常。 – Thorben 2013-02-17 21:51:47

+0

你在你的機器上測試過它嗎? – Thorben 2013-03-01 15:19:08

+0

否定的。我沒有編譯過的類就單獨測試了ruby。 – 2013-03-01 17:07:03