3

我想在 JRuby 中调用 Java 类的静态方法。目前为了实现这一点,我使用:

class_name = "com.slackworks.naether.util.LogUtil"
clazz = eval(class_name)
clazz.setLogLevel( "debug" )

必须使用 eval 将 String 转换为 Class 似乎很笨拙。我环顾四周,但找不到一个 JRuby 助手来代替eval.


我需要将 String 转换为 Class 的原因是,这发生在处理 JRuby 或 RJB 请求的包装器中,具体取决于 Ruby 运行时。如果 Ruby 运行时使用 RJB,则调用类似于:

class_name = "com.slackworks.naether.util.LogUtil"
clazz = Rjb::import( class_name )
clazz.setLogLevel( "debug" )
4

4 回答 4

4

So I stumbled upon a solution from looking at the JRuby Wiki. Java::JavaClass.for_name can be used to convert the String to a Java class, which can be converted to a Ruby class using ruby_class. Example using IRB:

jruby-1.6.8 :053 > math_class = Java::JavaClass.for_name("java.lang.Math").ruby_class
 => Java::JavaLang::Math 
jruby-1.6.8 :054 > math_class.floor( 10.7 )
 => 10.0 
于 2012-09-27T17:18:47.700 回答
1

你看过https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby吗?特别是java_import应该允许你这样做。

$ jruby -S irb
irb(main):001:0> java_import 'java.util.concurrent.TimeUnit'
=> [Java::JavaUtilConcurrent::TimeUnit]
irb(main):002:0> TimeUnit.values
=> java.util.concurrent.TimeUnit[NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]@46150133

在上面的示例中,您应该能够做到这一点:

require 'java'
java_import class_name
LogUtil.setLogLevel "debug"
于 2012-08-26T00:36:23.223 回答
0

如果您想加载/获取代理类而不将其实际挂钩到您的命名空间,您可以使用:

str_class = JavaUtilities.get_proxy_class("java.lang.String")

请注意:这仅在某些情况下有用,java_import如果可能,请正常使用。

于 2014-10-20T17:37:01.033 回答
0

如果您使用的是rails,您也可以使用constantize。

"Java::JavaLang::Math".constantize
 => Java::JavaLang::Math
于 2015-02-24T09:49:35.913 回答