从JRuby调用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文件,当涉及到编译步骤时,这是不可避免的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java代码中设置JRuby属性

来自分类Dev

从代码段调用SublimeText 2 API命令

来自分类Dev

以下Java代码段的含义

来自分类Dev

在JRuby中调用自定义Java类

来自分类Dev

使用代码段内部而不是外部的getresources调用优化我的Modx代码段?

来自分类Dev

modx revo ajax调用不执行大块内的代码段

来自分类Dev

无法通过快捷方式调用代码段

来自分类Dev

我调用“ atoi”函数后,代码导致了段错误

来自分类Dev

装饰类以在调用__get __()时运行一段代码

来自分类Dev

我调用“ atoi”函数后,代码导致了段错误

来自分类Dev

如何使一段代码稍后可调用

来自分类Dev

从Java代码调用SQL查询

来自分类Dev

从JAVA代码调用HTML页面

来自分类Dev

从Java代码调用ruby脚本

来自分类Dev

KNIME-Java代码段-DoubleCell / Java类型double []

来自分类Dev

我可以重构因方法调用而异但代码结构一致的代码段吗?

来自分类Dev

调用生成的Java类文件时,在JRuby中打开JSON文件会引发异常

来自分类Dev

如何在Java中简化此代码段?

来自分类Dev

此Java代码段中到底发生了什么?

来自分类Dev

在Java类方法中嵌入JavaScript代码段

来自分类Dev

如何生成编译后的代码段错误的java吗?

来自分类Dev

在每个时间段后执行代码,JAVA

来自分类Dev

如何在Java中简化此代码段?

来自分类Dev

gcc和clang都取消了对下面代码段中move构造函数的调用。这样对吗?

来自分类Dev

类成员B的析构函数,为什么在下面的代码段中调用它?

来自分类Dev

Chrome devtools:如何从另一个代码段调用函数?

来自分类Dev

当从另一段代码作为实例调用对象时,如何显示对象特征

来自分类Dev

无法通过存储在变量中的名称调用活动代码段

来自分类Dev

Python:按Enter调用一段代码或一个函数

Related 相关文章

  1. 1

    在Java代码中设置JRuby属性

  2. 2

    从代码段调用SublimeText 2 API命令

  3. 3

    以下Java代码段的含义

  4. 4

    在JRuby中调用自定义Java类

  5. 5

    使用代码段内部而不是外部的getresources调用优化我的Modx代码段?

  6. 6

    modx revo ajax调用不执行大块内的代码段

  7. 7

    无法通过快捷方式调用代码段

  8. 8

    我调用“ atoi”函数后,代码导致了段错误

  9. 9

    装饰类以在调用__get __()时运行一段代码

  10. 10

    我调用“ atoi”函数后,代码导致了段错误

  11. 11

    如何使一段代码稍后可调用

  12. 12

    从Java代码调用SQL查询

  13. 13

    从JAVA代码调用HTML页面

  14. 14

    从Java代码调用ruby脚本

  15. 15

    KNIME-Java代码段-DoubleCell / Java类型double []

  16. 16

    我可以重构因方法调用而异但代码结构一致的代码段吗?

  17. 17

    调用生成的Java类文件时,在JRuby中打开JSON文件会引发异常

  18. 18

    如何在Java中简化此代码段?

  19. 19

    此Java代码段中到底发生了什么?

  20. 20

    在Java类方法中嵌入JavaScript代码段

  21. 21

    如何生成编译后的代码段错误的java吗?

  22. 22

    在每个时间段后执行代码,JAVA

  23. 23

    如何在Java中简化此代码段?

  24. 24

    gcc和clang都取消了对下面代码段中move构造函数的调用。这样对吗?

  25. 25

    类成员B的析构函数,为什么在下面的代码段中调用它?

  26. 26

    Chrome devtools:如何从另一个代码段调用函数?

  27. 27

    当从另一段代码作为实例调用对象时,如何显示对象特征

  28. 28

    无法通过存储在变量中的名称调用活动代码段

  29. 29

    Python:按Enter调用一段代码或一个函数

热门标签

归档