`
deng131
  • 浏览: 672588 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Ruby中AOP实现方法

阅读更多
转自:http://blackanger.blog.51cto.com/140924/40810

Ruby是如何实现AOP的。。。只涉及AOP中的一个方面,拦截(Interception)
[Copy to clipboard] [ - ]
CODE:
# foo.rb
class Foo
def bar
"bar"
end
end


[Copy to clipboard] [ - ]
CODE:
# foo_advice.rb
class Foo
alias old_bar bar
def bar
"{[< "+ old_bar+ " >]}”
end
end

利用alias来拦截方法。。。来个稍微好点的:

[Copy to clipboard] [ - ]
CODE:
# foo_advice.rb
class Foo
old_bar = self.instance_method(:bar)
define_method(:bar) do
"{[< " + old_bar.bind(self).call() + " >]}"
end
end

为什么这个好呢?
用了define_method虽然不是那么清晰,但是代码却很健壮。防止不同域定义的同名对象冲突.

2.Ruby Inspection
许多反射方法:

[Copy to clipboard] [ - ]
CODE:
s="foo"
local_variables
global_variables
s.class
s.display
s.inspect
s.instance_variables
s.methods
s.private_methods
s.protected_methods
s.public_methods
s.singleton_methods
s.method(:size).arity
s.method(:replace).arity



继续:

[Copy to clipboard] [ - ]
CODE:
# List all the classes
ObjectSpace.each_object(Class) do |o|
puts o.inspect
end
# List all the modules
ObjectSpace.each_object(Module) do |o|
puts o.inspect
end
# List all the instances of class String
ObjectSpace.each_object(String) do |o|
puts o.inspect
end

回顾一下java的AOP概念的实现,无非就是利用java的反射机制,得到需要拦截的方法,然后增加切面。。。,Ruby 也一样。。。

问题:如何取消定义本类的所有实例变量?除了@attributes.下面例子可能次一点

[Copy to clipboard] [ - ]
CODE:
#a.rb
class A
   def test
      @var=1
      @attr = 2
      i = 1
      j = 2
     local_variables
   end
end

irb(main):111:0> a = A.new
=> #<A:0xcf0cab0>
irb(main):112:0> a.test
=> ["i", "j"]
irb(main):113:0> a.instance_variables
=> ["@var", "@attr"]


[Copy to clipboard] [ - ]
CODE:
#a_advice.rb
class A
   old_test = self.instance_method(:test)
   define_method(:test) do
      @attr = 2
       i = 1
       local_variables
    end
end

irb(main):122:0> a = A.new
=> #<A:0xcef92f8>
irb(main):123:0> a.test
=> ["old_test", "i"]
irb(main):124:0> a.instance_variables
=> ["@attr"]

分享到:
评论

相关推荐

    .net 下实现AOP

    总结来说,.NET下的AOP实现可以帮助我们保持代码的整洁和可维护性,通过将关注点分离,我们可以专注于核心业务逻辑,而将通用功能(如日志和性能监测)的实现交给拦截器或编译时/运行时织入机制。这种设计模式在大型...

    AOP-OC:Objective C 的一个小 aop 实现

    **Ruby** 在这里可能是作为标签出现,可能是因为开发者受到了Ruby语言中元编程特性的启发,Ruby在AOP实现上较为成熟。Ruby的元编程特性,比如块(Blocks)、Proc对象和lambda,以及模块的混入(Mixin),使其在AOP...

    Metaprogramming.Ruby

    8. **面向切面编程(AOP)**:探索AOP在Ruby中的应用,以及如何通过AOP技术实现代码的解耦和重用。 #### 五、总结 《Metaprogramming Ruby: Programming Like the Ruby Pros》不仅提供了一种学习Ruby元编程的有效途径...

    aop的实现原理_动力节点Java学院整理

    AOP的使用方法包括在不同的编程语言中具体实现切面的机制。例如,在Java中,可以利用Spring框架的AOP模块来定义切面。在Spring AOP中,切面可以是一个通知(Advice)加上一个或多个点cut。通知定义了何时执行切面...

    Monkey Patch猴子补丁编程方式及其在Ruby中的运用

    4、增加钩子,在执行某个方法的同时执行一些其他的处理,如打印日志,实现AOP等, 5、缓存,在计算量很大,结算之后的结果可以反复使用的情况下,在一次计算完成之后,对方法进行替换可以提高处理速度。 Ruby的类都...

    基于Java全栈开发的Nutz框架:Mvc/Ioc/Aop/Dao/Json一体化设计源码

    该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...

    LoginCheck:一个用 runtime 的 AOP 做的权限控制

    【LoginCheck:运行时AOP实现的权限控制】 在编程领域,权限控制是任何系统安全性的核心组成部分。本文将深入探讨LoginCheck项目,它利用了Ruby的动态特性,特别是运行时(runtime)的面向切面编程(AOP)来实现这...

    ruby_quest

    面向切面编程(AOP)在Ruby中也有体现,如`before`、`after`和`around`这样的回调方法,允许在特定操作前后插入代码,实现关注点分离。 异常处理是任何编程语言的重要部分,Ruby使用`begin..rescue..else..ensure`...

    2015_07_08-module_prepend:Colin Kelley使用Ruby 2.1的Module#prepend进行面向方面的编程,2015年7月8日发表

    从一开始就使用#alias_method_chain在Ruby on Rails中几乎可以实现这种方法。 但是,该方法以分层分解而闻名。 Yehuda Katz写了一系列博客文章,提倡使用Module和#super更清洁的方法。 这种方法效果很好,但仅在...

    Java cglib实例代码

    在 AOP 中, Log Aspect 是一个常见的应用,CGLib 使得 Log Aspect 的实现变得很简单。可以通过创建一个 LogDAOProxy 类,实现 MethodInterceptor 接口,生成一个 DAO 的子类,并且设置好 callback 到 proxy。然后,...

    Spring 2 参考

    - **Support for @AspectJ aspects**:增加了对@AspectJ注解的支持,从而能够利用更广泛的AOP实现。 #### 2.3 中间层改进 - **Easier configuration of declarative transactions in XML**:Spring 2.0简化了声明...

    28线程五大状态1

    在设计模式方面,提到了几种常见的模式,如单例模式(限制类只有一个实例)、工厂模式(用于创建对象)、包装模式(如IO流的包装)、代理模式(如Spring AOP实现的动态代理)和观察者模式(如监听器)。值传递和引用...

    AspectR-Fork-开源

    AspectR项目源自SourceForge,它提供了一个用于Ruby的AOP解决方案,允许开发者以声明性方式管理横切关注点,如日志、事务管理、性能监控等。 在Ruby中,AspectR提供了一种优雅的方式来组织代码,使得主要业务逻辑不...

    动态代码生成器动态代码生成器动态代码生成器

    这种技术广泛应用于各种软件开发场景,如元编程、反射、AOP(面向切面编程)、动态语言实现以及性能优化等。动态代码生成通常涉及以下几个核心概念和技术: 1. **元编程**:元编程允许程序员在编译时或运行时编写或...

    Castle 的 IOC 容器

    总的来说,Castle 项目的组件(包括 Castle Windsor、AspectSharp、Active Record、Dynamic Proxy 和 MonoRail)提供了强大的工具集,使得 .NET 开发者能够在开发过程中实现更加灵活、高效和可维护的解决方案。...

    Pro Spring 3

    - **Spring AOP 支持**:Spring 支持基于 XML 的 AOP 配置以及基于注解的 AOP 实现方式。此外,Spring 还提供了对 AspectJ 的集成支持。 #### 四、Spring 数据访问支持 - **JDBC 支持**:Spring 提供了一套 JDBC ...

    Java软件技术发展趋势探讨

    JRuby作为Ruby语言的一个实现,能够在Java虚拟机上运行,这不仅拓展了Java平台的功能边界,也为Ruby语言在企业级应用中的使用提供了可能。尽管面临着适应性和社区支持等问题,但随着JVM对动态语言支持的优化,JRuby...

    【Prototype 1.4.0】源码解读----全文注释版

    这个构造函数会在实例化时调用`initialize`方法,这是借鉴自Ruby的构造器。虽然`initialize`方法在生成类时并未定义,但后续扩展时会为其创建同名方法。`Class.create()`返回的构造函数类似于C#或JAVA中的类定义,...

    jfinal开发手册

    AOP(面向切面编程)在JFinal中是通过Interceptor实现的,它包括Before、After等拦截器类型,并支持拦截器的触发顺序配置。它还支持动态增强技术以及注入拦截器来提高开发效率和维护性。 ActiveRecord是JFinal中...

Global site tag (gtag.js) - Google Analytics