gpt4 book ai didi

java - 从 JRuby 调用 Java 代码片段?

转载 作者:行者123 更新时间:2023-12-02 04:58:24 26 4
gpt4 key购买 nike

如何从 JRuby 代码调用 Java 代码片段?我的代码片段非常短,实际上只是一些 Java 语句的集合。

最佳答案

解释here关于如何从 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 一样计算一个字符串,你需要先编译它;您可以使用 this question 中的技术,但 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

关于java - 从 JRuby 调用 Java 代码片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28536440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com