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 项目"的资源可能是用来演示和实践如何在Java中使用方法引用的实例。 方法引用可以被视为Lambda表达式的替代品,它提供了对已存在方法的直接...
在 Java 反射机制中,我们可以通过 Class 对象来获取类的信息,通过 Field 对象来获取类的成员变量,通过 Method 对象来获取类的方法。 例如,要获取某个对象的属性,我们可以使用以下代码: ```java public ...
可以通过Class对象的getMethod()或getMethods()方法获取Method对象。Method对象可以用于调用方法、获取方法的名称、参数列表等信息。 三、Field类的使用方式 Field类是Java中用于描述字段的类。一个Field对象对应...
例如,要执行某个对象的方法,可以使用 Method 对象的 invoke() 方法来调用该方法。该方法的参数是执行该方法的对象和参数数组。 在使用 Method.invoke() 方法时,需要注意参数的类型和数量,因为 Method.invoke() ...
1. 获取原始方法的Method对象:`let originalMethod = class_getInstanceMethod(class, originalSelector)` 2. 定义新的方法实现,并添加到类中:`class_addMethod(class, swizzledSelector, method_...
Class对象代表类,Field和Method对象分别表示类的字段和方法。反射对象的作用域通常局限于需要动态操作对象的代码段。 9. **同步对象(synchronized关键字)** Java中的synchronized关键字用于控制并发访问,确保...
// 调用setter方法,targetObject为目标对象实例,method是setter方法的Method对象 ``` 对于Boolean类型,我们需要注意Map中的值可能是"true"或"false"字符串,所以我们需要将其转换为Boolean对象: ```java ...
* @param method 对象属性的获取方法名称 * @param sort 排序方式:desc(降序)或asc(升序) */ @SuppressWarnings({"unchecked", "rawtypes"}) public void Sort(List<E> list, final String method, final ...
1. 获取原始方法的Method对象,使用`class_getInstanceMethod`或`class_getClassMethod`。 2. 创建新的方法实现,使用`method_getImplementation`和`method_getTypeEncoding`。 3. 使用`method_setImplementation`...
调用对象的方法需要先获取Method对象,这可以通过`Class ownerClass = owner.getClass()`获取对象的Class,然后`Method method = ownerClass.getMethod(methodName, argsClass)`根据方法名和参数类型数组查找对应的...
一旦有了Method对象,就可以调用invoke()方法在指定的对象上执行该方法,这使得在运行时动态调用方法成为可能。这对于实现插件系统、动态代理等高级功能至关重要。 反射机制在实际开发中有很多应用,比如: - **...
3. Method 对象:Method 对象代表了一个类的方法,通过它可以调用方法。 4. Field 对象:Field 对象代表了一个类的字段,通过它可以获取或设置字段的值。 Java 反射机制的应用 1. 动态加载类:通过 Class.forName...
我们可以获取并调用Method对象表示的方法,或者通过Field对象访问或修改字段值。 将DOM4J与反射结合,我们可以实现XML到Java对象的映射。首先,解析XML文档得到Element对象,然后根据Element的标签名创建对应的Java...
- **Method对象**:用于表示类的方法。 - **Constructor对象**:用于表示类的构造函数。 #### 三、反射的应用场景 反射机制通常用于以下几种情况: - **动态代理**:利用反射机制可以动态地创建代理类。 - **框架...
3. **Method对象**:通过`Class`对象可以获得类中的所有方法,每个方法都是通过`Method`对象表示。 4. **Constructor对象**:通过`Class`对象可以获得类中的构造器,每个构造器都是通过`Constructor`对象表示。 ###...
* public Method[] getDeclaredMethods():用于返回一个包含Method对象的数组,这些Method对象对应该类或接口所有的方法,不包括从父类继承的方法 * public Constructor[] getConstructors():用于返回一个包含...
- **Method对象**:表示类的方法,通过`Class.getMethods()`或`Class.getDeclaredMethods()`获取。 - **Field对象**:表示类的字段,通过`Class.getFields()`或`Class.getDeclaredFields()`获取。 ### 2. 如何使用...
2. **获取私有方法的Method对象**:使用`Class`对象的`getDeclaredMethods()`方法,可以获取类中所有的方法,包括私有方法。然后通过`getMethod()`或`getDeclaredMethod()`方法,指定方法名和参数类型,获取私有方法...