莊周夢蝶

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

          JRuby中使用接口和抽象類

          Posted on 2008-02-15 14:34 dennis 閱讀(1520) 評論(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
          強呀,思路不錯
          主站蜘蛛池模板: 玉树县| 六安市| 铜川市| 奉节县| 临海市| 曲靖市| 通化县| 元江| 柳州市| 保亭| 汉源县| 论坛| 宣城市| 金昌市| 恩平市| 东海县| 邛崃市| 华坪县| 合水县| 东乌珠穆沁旗| 靖边县| 弥渡县| 江孜县| 定安县| 连平县| 柳州市| 赣榆县| 乌鲁木齐市| 邯郸县| 定安县| 昌图县| 旺苍县| 阳信县| 托克逊县| 甘孜县| 西盟| 禹州市| 富民县| 皮山县| 阳高县| 宿州市|