莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          JRuby中使用接口和抽象類

          Posted on 2008-02-15 14:34 dennis 閱讀(1521) 評論(1)  編輯  收藏 所屬分類: 動態語言java
              要在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)




          評論

          # re: JRuby中使用接口和抽象類  回復  更多評論   

          2008-02-17 12:26 by 51ytw
          強呀,思路不錯
          主站蜘蛛池模板: 井研县| 新和县| 康平县| 永兴县| 福鼎市| 开阳县| 绥中县| 莲花县| 全南县| 东光县| 福鼎市| 柳州市| 莱阳市| 郑州市| 广饶县| 长岛县| 阿巴嘎旗| 东丰县| 江源县| 西宁市| 石首市| 孟州市| 黄山市| 江达县| 象山县| 仪陇县| 阳原县| 独山县| 新绛县| 天峨县| 河津市| 原阳县| 象州县| 西乌| 惠安县| 西峡县| 通江县| 麻栗坡县| 报价| 绥滨县| 宁城县|