Statement
对象表示基本语句,其中将单个方法应用于某一目标和一组参数,以返回结果,比如
"a.setFoo(b)"
。注意,此示例使用名称来指示目标及其参数,statement 对象不需要名称空间,可以使用值本身构造。statement 对象将指定方法与其环境相关联,作为值的简单集合:目标和参数值数组。
其构造函数如下:
Statement(Object target, String methodName, Object[] arguments)
按照所给参数创建一个新的
Statement
对象,使其具有
target
、
methodName
和
arguments
。
Statement的一个重要方法:
public void execute()throws Exception
execute 方法执行方法找到一个与 methodName 属性同名的方法,并在目标上调用该方法。 当目标的类使用给定名称定义大量方法时,该实现应该使用 Java Language Specification (15.11) 中指定的算法选择最明确的方法。目标和参数的动态类被用于替换编译时类型信息,与
java.lang.reflect.Method
类本身类似,基本值与相关包装器类之间的转换是内部处理的。
以下方法类型被作为特殊情况处理:
- 可以通过将类对象用作目标来调用静态方法。
- 使用保留的方法名 "new" 调用类的构造方法,如同所有类都定义了静态 "new" 方法。构造方法调用通常被认为是
Expression
而不是 Statement
,因为它们返回一个值。
-
java.util.List
接口中定义的方法名称 "get" 和 "set" 也可以应用于数组实例,映射到 Array
类中的同一名称的静态方法。
使用实例如下:
package com.kkoolerter;
import java.beans.Statement;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
List<String> lists = new ArrayList<String>();
lists.add("A");
lists.add("B");
lists.add("c");
Main target = new Main();
Statement statment = new Statement(target,"sayHello",new Object[]{"China"});
statment.execute();
System.out.println(statment.toString());
statment = new Statement(target,"sayHello",new Object[]{});
statment.execute();
System.out.println(statment.toString());
statment = new Statement(Main.class,"staticSayHello",new Object[]{"Static"});
statment.execute();
System.out.println(statment.toString());
statment = new Statement(lists,"add",new Object[]{"1"});
//System.out.println(statment.execute());
System.out.println(statment.toString());
System.out.println(lists.toString());
}
public void sayHello(String name){
System.out.println("Hello,"+name);
}
public void sayHello(){
System.out.println("Hello,Void");
}
public static void staticSayHello(String name){
System.out.println("Hello,"+name);
}
}
通过查看JDK源码可以知道,execute方法主要是通过getMethod(target.getClass(), methodName, argClasses);方式来获取所要执行的方法对象。
参考文档:JDK中文文档,JDK源码。