加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否可以从JRuby创建Java类并在Java中使用它们?

发布时间:2020-12-17 02:29:05 所属栏目:百科 来源:网络整理
导读:我正在尝试从J Ruby扩展Lucene的Analyzer并从java中使用它.一个简单的分析器看起来像: class MyAnalyzer Java::OrgApacheLuceneAnalysis::Analyzer def TokenStream (file_name,reader) result = StandardTokenizer.new(Version::LUCENE_CURRENT,reader) re
我正在尝试从J Ruby扩展Lucene的Analyzer并从java中使用它.一个简单的分析器看起来像:

class MyAnalyzer < Java::OrgApacheLuceneAnalysis::Analyzer
  def TokenStream (file_name,reader) 
     result = StandardTokenizer.new(Version::LUCENE_CURRENT,reader)
     result = LowerCaseFilter.new(result)
     result = LengthFilter.new(result,3,50) 
     result = StopFilter.new(result,StandardAnalyzer.STOP_WORDS_SET)
     result = PorterStemFilter.new(result)
     result
  end 
end

然后我编译它:jrubyc -c /home/camilo/trunk/utils/target/dependency/lucene-core-3.0.2.jar –javac MyAnalyzer.rb并将其打包为jar.

现在,当尝试在java中使用MyAnalyzer时,MyAnalyzer是org.jruby.RubyObject的后代,而不是org.apache.lucene.analysis.Analyzer的后代.

有没有办法让Java将MyAnalyzer视为分析器而不是RubyObject?或者这是否超出了JRuby现在可以做的范围?

JRuby版本:jruby 1.6.0(ruby 1.8.7 patchlevel 330)

解决方法

根据我的理解,我猜你正在尝试创建一个扩展Java类(使用脚本引擎)的JRuby类,并将该类交还给Java.

您的Ruby类可能如下所示:

require 'java'
require 'lucene-core.jar'

java_import 'org.apache.lucene.analysis.Analyzer'
java_import 'org.apache.lucene.analysis.standard.StandardTokenizer'
java_import 'org.apache.lucene.util.Version'
java_import 'org.apache.lucene.analysis.TokenStream'
java_import 'java.io.Reader'

class MyAnalyzer < Analyzer

  def tokenStream(file_name,reader)
      # ...
  end 
end

然后,您可以在Java中使用此类,如下所示:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;

public class RunMyAnalyzer {

    public static void main(String[] args) throws ScriptException,FileNotFoundException {
        String filename = "my-analyzer.rb";

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("jruby");
        Reader reader = new FileReader(filename);
        engine.eval(reader);

        // Instantiate the JRuby class,and cast the result of eval.
        Analyzer analyzer = (Analyzer) engine.eval("MyAnalyzer.new");

        // You can then use this analyzer like a Lucene Analyzer
    }
}

然后编译并运行:

$javac -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer.java 
$java -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer

这里的关键是JRuby生成一个代理类,然后可以将其转换为Java超类Class.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读