gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:59 26 4
gpt4 key购买 nike

我正在尝试从 JRuby 扩展 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 时,MyAnalyzerorg.jruby.RubyObject 的后代,而不是 org.apache.lucene.analysis.Analyzer.

有没有办法让 Java 将 MyAnalyzer 视为 Analyzer 而不是 RubyObject?还是这种方式超出了 JRuby 现在可以做的范围?

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

最佳答案

根据我从您的尝试中了解到的情况,我猜您正在尝试创建一个 JRuby 类来扩展 Java 类(使用脚本引擎),然后将该类交还给 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)
result = StandardTokenizer.new(Version::LUCENE_CURRENT, 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 父类(super class) Analyzer

关于java - 是否可以从 JRuby 创建 Java 类并在 Java 中使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721134/

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