簡體   English   中英

從JRuby調用Java代碼段?

[英]Calling Java code snippet from JRuby?

如何從JRuby代碼中調用Java代碼段? 我的代碼片段很短,實際上只是一些Java語句的集合。

這里解釋如何從JRuby調用現有的Java代碼。 最基本的用法:

require 'java'
java.lang.System.out.println("Hello, world!")

作為更復雜的示例,如果要從JAR導入任意包(例如'foo.bar.baz'),可以執行以下操作:

require 'java'
require 'foobarbaz.jar'
def foo
  Java::Foo
end
shiny_thingy = foo.bar.baz.Thingy.new("Shiny")
shiny_thingy.shine()

如果要像對待Java一樣評估字符串,則需要先對其進行編譯; 您可以在此問題中使用這些技術,但是Java通常對自動生成的代碼不滿意,並且這樣做並不簡單。 或者,您可以將其轉換為JRuby,如上所述,調用Java類,然后跳過編譯問題。

如果我們知道您的代碼片段由什么組成,我們可能會更好地提供幫助。

編輯:這是實例化任意類的鏈接代碼的改編。 請注意,它將創建.class文件,涉及編譯步驟時,這是不可避免的AFAIK。 該代碼假定存在一個名為tmp的子目錄。 適應您的用例。

shiny_source = <<-EOF
  package foo.bar.baz;
  public class Shiny {
    public Shiny() {
      System.out.println("I'm shiny!");
    }
  }
EOF

require 'java'
java_import javax.tools.SimpleJavaFileObject
java_import java.net.URI

class JavaSourceFromString < SimpleJavaFileObject
  def initialize(name, code)
    uri = "string:///" + name.gsub('.', '/') + Kind::SOURCE.extension
    super URI.create(uri), Kind::SOURCE
    @code = code
  end

  def getCharContent(ignore_encoding_errors)
    @code
  end
end

java_import javax.tools.ToolProvider
java_import java.io.StringWriter
java_import java.net.URL
java_import java.net.URLClassLoader

compilation_path = java.nio.file.Paths.get('tmp').to_absolute_path.to_s
jc = ToolProvider.get_system_java_compiler
raise "Compiler unavailable" unless jc

jsfs = JavaSourceFromString.new('foo.bar.baz.Shiny', shiny_source)
file_objects = [jsfs]
ccl = java.lang.Thread.current_thread.get_context_class_loader
classpath = ccl.getURLs.to_a.join(java.io.File::pathSeparator)
options = ['-d', compilation_path, '-classpath', classpath]
output = StringWriter.new
success = jc.get_task(output, nil, nil, options, nil, file_objects).call
raise output unless success

url = URL.new("file:" + compilation_path + "/")
ucl = URLClassLoader.new_instance([url].to_java(URL))
shiny_class = ucl.load_class('foo.bar.baz.Shiny')
shiny_class.new_instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM