3

JRubyのJavaクラスで静的メソッドを呼び出したい。現在、これを達成するために私は使用します:

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

文字列をクラスに変換するためにevalを使用しなければならないのは不器用なようです。周りを見回しましたが、代わりにJRubyヘルパーを見つけることができませんeval


クラスに変換するために文字列が必要な理由は、Rubyランタイムに応じて、JRubyまたはRJBを介したリクエストを処理するラッパーで発生しているためです。RubyランタイムがRJBを使用する場合、呼び出しは次のようになります。

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

4 に答える 4

4

そこで、JRubyWikiを見て解決策を見つけました。Java::JavaClass.for_name文字列をJavaクラスに変換するために使用できます。Javaクラスは、を使用してRubyクラスに変換できますruby_class。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

レールを使用している場合は、constantizeを使用することもできます。

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