从JRuby调用Java代码片段?

从JRuby调用Java代码片段?,java,jruby,Java,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::

如何从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
文件,这在涉及编译步骤时是不可避免的。代码假定存在名为
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

shinny_source=它是Java代码的任意字符串;方法的主体。它是用户输入的,还是预先确定的?如果是后者,你可以发布它,或者类似的东西吗?PS编译代码远远不够;加载和调用它也是必要的。@user626528:与编译相比,加载和调用非常简单。看起来非常复杂。执行javac进程不是更好吗?