`
yanzilee9292
  • 浏览: 528404 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ruby静态方法hook

    博客分类:
  • ruby
 
阅读更多

 静态方法和实例方法的实现方式不一样,代码如下:

 

class M
  class << self
    def save(tt,a)
      #puts "save #{tt} #{t3}"
      puts "save #{tt} #{a}"
    end
    # def reload(flag)
      # puts "reloaded"
    # end
    
    def __create_rule_before( method, comment = '', &block)
    return if method.to_s=='__create_rule_before' 
      puts "method= #{method} #{method.class}"
      args = M.method(method).arity == 0 ? '' : '(*args)'
      puts "args= #{args}"
      b_id = "%04x" % block.object_id
      old_method_name = :"__previous_#{method}_#{b_id}"
      #alias_method old_method_name, method
      
      puts "method= #{old_method_name} #{old_method_name.class}"
      define_singleton_method :"__before_#{method}_#{b_id}", &block
      # class_eval <<-EOT
        # class <<M
          # alias old_method_name method 
        # end
      # EOT
      a2 = "class << M\nalias :#{old_method_name} :#{method}\nend"
      class_eval(a2)
      
      class_eval <<-EOT
        class << self
        #alias old_method_name method
        def #{method}#{args}
          __before_#{method}_#{b_id}#{args}
          puts "__previous_#{method}_#{b_id}#{args}"
          __previous_#{method}_#{b_id}#{args}
        end
        end
      EOT
    end
  end
  

  M.singleton_methods.each do |name|
    #Hook.hook_method name,self
    puts self
    M.__create_rule_before(name) { |*args| puts "BEFORE SAVE#{args}" }
  end
  
end
M.save  'test me','a'
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics