JRuby java.lang.ClassCastException

时间:2013-02-14 14:29:41

标签: jruby invokedynamic

我使用http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html中的一个小Jruby脚本来测试invokedynamic:

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)

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

使用过的命令行:

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它可以工作,但在另一个项目中使用classfiles时遇到了问题。

有没有人想知道如何解决它? 如何在Java 7上使用JRuby和indy?

1 个答案:

答案 0 :(得分: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