Можно ли переопределить классы Java в JRuby? - PullRequest
1 голос
/ 23 марта 2011

Как мне переопределить существующие методы Java в JRuby? Прямо сейчас можно переопределить методы Ruby. Я спрашиваю это, потому что, когда вы пишете что-то вроде

include Java

puts java.io.File.separator

и исследовать java, io и File, получается, что java и io имеют тип "ruby module", а File является "классом". Поэтому мне было интересно, можно ли написать что-то подобное и ожидать, что это сработает

module Java
    module JavaIoType
        class File
          class << self
                alias_method :old_sp, :separator
                def separator(*args)
                    Kernel.puts caller
                    old_sp(*args)
                end
            end
        end
    end
end

Но это не так: (

Существует также аналогичный вопрос для clojure. Мне просто интересно, будет ли другой ответ на JRuby.

Я знаю, что это немного натянуто, но я все равно спрашиваю.

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Это работает для меня (используя JRuby 1.6):

require 'java'
java_import 'java.io.File'

puts Java::JavaIo::File::separator

module Java
  module JavaIo
    class File
      class << self
        alias_method :old_sp, :separator
        def separator(*args)
          Kernel.puts caller
          old_sp(*args)
        end
      end
    end
  end
end

puts Java::JavaIo::File::separator

Выходы:

\
test_io.rb:20:in `(root)'
\
0 голосов
/ 18 июля 2012

Работает.

require 'rubygems'
require "java"

java_import "java.io.File" do 
  :JavaFile
end

class JavaFile

   alias_method :old_getName, :getName

   def getName()
        Kernel.puts caller
        old_getName()
    end

end

x = JavaFile.new('HelloFile.txt')

puts(x.getName())

Но:

Работает только со стороны jruby

Кстати: разделитель - это статическая строка, а не метод.

0 голосов
/ 23 марта 2011

Я не эксперт в этом, но из моего понимания методы Java нельзя переопределить из JRuby, потому что он уже скомпилирован.

У вас есть полная свобода в ruby ​​для переопределения методов из-за его динамической природы.

И я верю, что нормальные переопределенные методы через наследование будут работать. Вы можете создать его подкласс и переопределить поведение. Но в вашем случае вы переопределяете статический метод, поэтому эта опция также невозможна.

Но переопределение методов методов объекта будет работать с некоторыми обезьянами, исправляющими . И эти методы доступны только для JRuby.

...