如何从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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句