天天看点

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

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>