閱讀403 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JRuby中使用接口和抽象類

  要在JRuby中實現java接口,接口include進來,實現接口方法即可,例如實現java.lang.Runnable接口做線程處理:
require 'java'
include_class 'java.lang.Runnable'
class
 TestRunnable
    include Runnable
    
def initialize(name)
      @name
=name     
    end
    
def run
      puts 
"hello,"+@name
    end
end

    要在JRuby中繼承抽象類,實現其中的抽象方法,方法稍微麻煩點,需要cglib,到這裏下載cglib-nodep-2.1_3.jar,寫個通用庫abstract_class.rb方便處理:

load 'cglib-nodep-2.1_3.jar'

class Object
  include Java
  include_class 
"net.sf.cglib.proxy.Enhancer"
  include_class 
"net.sf.cglib.proxy.NoOp"
  
  
class <<self
    
def method_missing(mname, *args, &block)
      unless mname 
== :abstract_impl and respond_to?(:java_class) and JavaLang::reflect::Modifier.isAbstract(JavaLang::Class.for_name(java_class.name).modifiers)
        super
      
else
        generate_abstract_impl(args, 
&block)
      end
    end
    
    private 
    
    
def generate_abstract_impl(args, &block)
      factory 
= Enhancer.new
      factory.setSuperclass(java_class)
      factory.setInterfaces(java_class.interfaces.to_java(
"java.lang.Class"))
      factory.setCallback(NoOp::INSTANCE)
      
      object_args 
= args.map { |arg| Java.ruby_to_java(arg) }
      class_arguments 
= object_args.map {|arg| arg.java_class}.to_java("java.lang.Class")
      generated_class 
= factory.create(class_arguments, object_args.to_java("java.lang.Object"))
      
      ruby_class 
= Class.new(generated_class.class)
      ruby_class.class_eval(
&block)
      
      
return ruby_class.new(*args)
    end
  end
  
end

    使用的話,require一下abstract_class,例如我們要繼承java.util.TimerTask,實現其中的run方法:
$:.unshift File.join(File.dirname(__FILE__),'.')
require 
'java'
require 
'abstract_class'
import java.util.TimerTask
import java.util.Timer
timer_task 
= TimerTask.abstract_impl do
  
def run
    puts 
"timer task"
  end
end

Timer.new.schedule(timer_task, 
10001000)
文章轉自莊周夢蝶  ,原文發布時間2008-02-15

最後更新:2017-05-17 17:31:47

  上一篇:go  14個月365起融資事件、巨頭布局加速......人工智能商業化的時機到了嗎?
  下一篇:go  google translator 0.2