`

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
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)
 


2
0
分享到:
评论

相关推荐

    Groovy vs_ JRuby Presentation.ppt

    在基本特性方面,Groovy支持静态类型和动态类型的使用,具有元编程能力,允许在运行时修改类和方法。而JRuby则完全支持Ruby的所有特性,如块、方法定义和模块,同时也允许与Java无缝交互。 在高级Java集成方面,...

    Java脚本教程(学习资料)

    作为`ScriptEngine`的一个抽象类,`AbstractScriptEngine`为子类提供了一些默认实现,减少了实现`ScriptEngine`接口的复杂性。尽管通常你不会直接使用这个类,但了解它的存在有助于理解整个API的设计。 4. **...

    Spring中文帮助文档

    10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 ...

    java api 1.7 中文文档

    `JAVA_API_1.7中文.chm`文件是Java API 1.7的中文帮助文档,它详尽地列出了所有可用的类、接口、方法和构造函数,是开发者日常开发中不可或缺的参考资料。通过查阅这个文档,开发者可以快速查找和理解Java 1.7中的...

    Spring 2.0 开发参考手册

    10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate...

    解析Java的设计模式编程之解释器模式的运用.pdf

    在类图中,通常包括抽象表达式接口、终结符表达式类、非终结符表达式类以及上下文类。 优点: 1. 扩展性:解释器模式允许方便地修改或扩展语法规则,只需改动相应的非终结符表达式类即可。 2. 灵活性:对于需要动态...

    Spring API

    10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. ...

    spring chm文档

    10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate...

    jdk api 1.8中文.rar

    JDK API 1.8中文版是Java开发人员的重要参考资料,它包含了Java Development Kit (JDK) 1.8的所有公共类、接口、方法和异常的详细说明。这个压缩包包含了两个文件:jdk api 1.8中文.CHM和jdk api 1.8中文.chw,它们...

    JDK SE8 Java语言规范与虚拟机规范 官方文档

    3. **默认接口方法**:在接口中添加非抽象方法,允许接口扩展功能而无需强制实现类去覆盖这些方法。 4. **新的日期/时间API**:`java.time`包提供了更强大、更易于使用的日期和时间API,取代了原有的`java.util....

    jdk免安装版(1.8+1.7,64位)

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者...用户只需将解压后的文件夹添加到系统的PATH环境变量中,就可以在命令行中使用javac编译Java源代码,或者使用java命令运行已编译的class文件了。

    基础篇.pdf

    面向对象的五项基本原则是单例职责原则(每个类应有单一职责)、开放封闭原则(软件实体对扩展开放,对修改关闭)、里氏替换原则(子类对象应当可以替换掉父类对象而不会影响程序的正确性)、接口隔离原则(接口应当...

    解析Java的设计模式编程之解释器模式的运用.docx

    - 避免在关键模块中使用解释器模式,因为维护工作可能变得复杂。 - 可以考虑使用脚本语言(如Shell、JRuby、Groovy等)来替代解释器模式,以提高效率和性能。 解释器模式虽然不常用于大型系统,但在特定场景下仍能...

    动力学

    2. **接口与抽象类**:Java提供了接口和抽象类来实现多态性。接口是一种完全抽象的类型,定义了一组方法签名,实现接口的类必须提供这些方法的具体实现。抽象类则可以包含具体的方法实现,为子类提供部分基础功能。...

    JAVA_API文档_1.7(English)

    9. **Applets**:在Java 7中,`applets`(小程序)相关的API仍存在于`javax.applet`包中,但随着浏览器对Java插件的支持逐渐减少,这个技术已经过时,不建议在新项目中使用。 10. **动态语言支持**:`invokedynamic...

    Java虚拟机规范 JavaSe7

    5. 集合框架增强:JavaSe7引入了新的集合接口和实现,如`Map.Entry`的`remove()`方法,以及`NavigableSet`和`NavigableMap`,提供了更强大的排序和遍历功能。 6. try-with-resources语句:这是一个新的异常处理结构...

    JDK1.7api开发手册

    JDK 1.7允许在枚举类型中定义抽象方法,并通过匿名内部类的方式实现。这使得枚举类型可以作为策略模式或者工厂模式的一部分,增强了枚举的可扩展性。 6. **动态语言支持(Dynamic Languages Support)** JSR 292...

    core java 7 第2卷

    10. **开关语句支持字符串**:Java 7允许在switch语句中使用字符串,使得基于字符串的条件判断更加方便。 在《Core Java 7 第2卷》中,作者会详细解释这些特性的用法、原理和最佳实践,同时还会涵盖Java标准库的...

    Java虚拟机规范(Java_SE_7)

    8. **动态类型语言支持**:Java 7开始支持动态类型语言如Groovy和JRuby,这扩展了Java平台的生态,使得开发者可以利用动态语言的灵活性。 9. **NIO.2(New I/O 2)**:Java 7引入了NIO.2,提供了一套新的文件系统...

Global site tag (gtag.js) - Google Analytics