是否可以从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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |