要在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
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
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
使用的話,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"
timer.new.schedule(timer_task, 1000, 1000)
文章轉自莊周夢蝶 ,原文釋出時間2008-02-15 <b></b>