`
qzriso
  • 浏览: 243042 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Method对象

 
阅读更多

Method 对象是由 Object#method(:method_name) 方法创建的,且与一个特定对象相关联(而不是与一个类关联)。它们可以被用于调用这个对象内的方法,就像与迭代器关联的块一样。

Method 对象封装了方法的实体 ( 是内容而不是方法名 ) 和被调对象 ( 即持有这个方法的对象 )

Method 对象与 Proc 对象的区别在于:在生成 Method 对象之前必须有可供提取的方法,而 Proc 对象则没有这些限制。由此可见, Proc 对象用过即抛型,而 Method 对象是反复利用型。另外,两者内部包含的代码规模也有不同。 Proc 对象包含的代码较少,而 Method 对象包含的代码较多。

 

例如:

class Thing

def square(n)

n*n

end

end

aThing = Thing.new # 创建对象

aMethod = aThing.method("square") # 获取与这个对象相关联的 Mehtod 对象。

 

aMethod.call(9) #-> 81

[ 1, 2, 3 ].collect(&aMethod) #-> [1, 4, 9]

 

在下面情况, Method 对象是非常有用的:

class Foo

def foo() "foo" end

def bar() "bar" end

def baz() "baz" end

end

 

obj = Foo.new

 

# 将索引与方法的关系存入哈希表中

methods = {1 => obj.method(:foo), 2 => obj.method(:bar), 3 => obj.method(:baz)}

# 使用索引调出相关方法

p methods[1].call # => "foo"

p methods[2].call # => "bar"

p methods[3].call # => "baz"

 

上面的例子中将生成的 Method 对象固化在了哈希表中。若不想固化被调对象时,可以使用 Object#send(:method_name) 方法。

 

class Foo

def foo() "foo" end

def bar() "bar" end

def baz() "baz" end

end

 

# 将索引和方法 ( ) 的关系存入哈希表

# 请注意 , 此时并不包括被调的信息

# 所以,你可存入任意的方法名。反正此处无被调信息。

methods = {1 => :foo, 2 => :bar, 3 => :baz}

 

# 使用索引调出相关方法

# 被调可以是任意对象 ( 并不一定是 Foo 类的实例 )

p Foo.new.send(methods[1]) # => "foo"

p Foo.new.send(methods[2]) # => "bar"

p Foo.new.send(methods[3]) # => "baz"

分享到:
评论

相关推荐

    method-reference:以编译器安全的方式引用 Method 对象的 Java 项目

    这个名为"method-reference:以编译器安全的方式引用 Method 对象的 Java 项目"的资源可能是用来演示和实践如何在Java中使用方法引用的实例。 方法引用可以被视为Lambda表达式的替代品,它提供了对已存在方法的直接...

    java反射机制及Method.invoke解释

    在 Java 反射机制中,我们可以通过 Class 对象来获取类的信息,通过 Field 对象来获取类的成员变量,通过 Method 对象来获取类的方法。 例如,要获取某个对象的属性,我们可以使用以下代码: ```java public ...

    JavaSE062Class类、Method类及Field类的使用方式深度探析.doc

    可以通过Class对象的getMethod()或getMethods()方法获取Method对象。Method对象可以用于调用方法、获取方法的名称、参数列表等信息。 三、Field类的使用方式 Field类是Java中用于描述字段的类。一个Field对象对应...

    java反射机制详解及Method.invoke解释.pdf

    例如,要执行某个对象的方法,可以使用 Method 对象的 invoke() 方法来调用该方法。该方法的参数是执行该方法的对象和参数数组。 在使用 Method.invoke() 方法时,需要注意参数的类型和数量,因为 Method.invoke() ...

    swift-利用AOP的思想通过方法交换(MethodSwizzle黑魔法修改ios系统类库方法)的做法

    1. 获取原始方法的Method对象:`let originalMethod = class_getInstanceMethod(class, originalSelector)` 2. 定义新的方法实现,并添加到类中:`class_addMethod(class, swizzledSelector, method_...

    java内置对象作用域

    Class对象代表类,Field和Method对象分别表示类的字段和方法。反射对象的作用域通常局限于需要动态操作对象的代码段。 9. **同步对象(synchronized关键字)** Java中的synchronized关键字用于控制并发访问,确保...

    使用Java反射机制将Map转换为Java对象,支持Boolean、Date类型

    // 调用setter方法,targetObject为目标对象实例,method是setter方法的Method对象 ``` 对于Boolean类型,我们需要注意Map中的值可能是"true"或"false"字符串,所以我们需要将其转换为Boolean对象: ```java ...

    List 对象属性排序

    * @param method 对象属性的获取方法名称 * @param sort 排序方式:desc(降序)或asc(升序) */ @SuppressWarnings({"unchecked", "rawtypes"}) public void Sort(List<E> list, final String method, final ...

    swift-AopTestDemo:iOS埋点统计方案:1.MethodSwizzling2.AOP编程

    1. 获取原始方法的Method对象,使用`class_getInstanceMethod`或`class_getClassMethod`。 2. 创建新的方法实现,使用`method_getImplementation`和`method_getTypeEncoding`。 3. 使用`method_setImplementation`...

    java反射机制

    调用对象的方法需要先获取Method对象,这可以通过`Class ownerClass = owner.getClass()`获取对象的Class,然后`Method method = ownerClass.getMethod(methodName, argsClass)`根据方法名和参数类型数组查找对应的...

    java反射机制知识点

    一旦有了Method对象,就可以调用invoke()方法在指定的对象上执行该方法,这使得在运行时动态调用方法成为可能。这对于实现插件系统、动态代理等高级功能至关重要。 反射机制在实际开发中有很多应用,比如: - **...

    java反射详解例子

    3. Method 对象:Method 对象代表了一个类的方法,通过它可以调用方法。 4. Field 对象:Field 对象代表了一个类的字段,通过它可以获取或设置字段的值。 Java 反射机制的应用 1. 动态加载类:通过 Class.forName...

    dom4j+反射,面向对象方式的xml格式转换

    我们可以获取并调用Method对象表示的方法,或者通过Field对象访问或修改字段值。 将DOM4J与反射结合,我们可以实现XML到Java对象的映射。首先,解析XML文档得到Element对象,然后根据Element的标签名创建对应的Java...

    Java反射机制

    - **Method对象**:用于表示类的方法。 - **Constructor对象**:用于表示类的构造函数。 #### 三、反射的应用场景 反射机制通常用于以下几种情况: - **动态代理**:利用反射机制可以动态地创建代理类。 - **框架...

    Java中的反射机制

    3. **Method对象**:通过`Class`对象可以获得类中的所有方法,每个方法都是通过`Method`对象表示。 4. **Constructor对象**:通过`Class`对象可以获得类中的构造器,每个构造器都是通过`Constructor`对象表示。 ###...

    Java-JDK、数据库系统开发、Web开发学习笔记

    * public Method[] getDeclaredMethods():用于返回一个包含Method对象的数组,这些Method对象对应该类或接口所有的方法,不包括从父类继承的方法 * public Constructor[] getConstructors():用于返回一个包含...

    JAVA反射笔记 md格式

    - **Method对象**:表示类的方法,通过`Class.getMethods()`或`Class.getDeclaredMethods()`获取。 - **Field对象**:表示类的字段,通过`Class.getFields()`或`Class.getDeclaredFields()`获取。 ### 2. 如何使用...

    junit测试private函数

    2. **获取私有方法的Method对象**:使用`Class`对象的`getDeclaredMethods()`方法,可以获取类中所有的方法,包括私有方法。然后通过`getMethod()`或`getDeclaredMethod()`方法,指定方法名和参数类型,获取私有方法...

Global site tag (gtag.js) - Google Analytics