JRuby中使用接口和抽象类

本文介绍如何在JRuby环境中实现Java接口及继承抽象类的方法,并提供具体示例,包括实现Runnable接口和继承TimerTask抽象类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    要在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, 1000, 1000)
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值