需求场景:根据一个配置,找到一个包含可变参数的方法
知识点:
- 可变参数作为方法参数类型在反射如何表达(可变参数类型是数组)
- 自定义类如何动态构造一个数组类型
场景举例:要求找到Demo类的test方法,demo对应spring bean id,无需关注,配置如下:
<invoker target="demo.test">
<params >
<param type="com.alibaba.cep.utils.A[]" ></param>
</params>
</invoker>
<params >
<param type="com.alibaba.cep.utils.A[]" ></param>
</params>
</invoker>
其中A.java代码:
package com.alibaba.cep.utils;
/**
* 类A.java的实现描述:TODO 类实现描述
*
* @author <a href="mailto:fangcheng.xiaofc@alibaba-inc.com">fangcheng.xiaofc</a> 2012-8-22 上午10:18:24
*/
public class A {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
Demo.java代码:
package com.alibaba.cep.utils;
public class Demo {
public void test(A... a) {
for (A a2 : a) {
System.out.println("name:" + a2.getName() + ",pwd=" + a2.getPwd());
}
}
}
写个Main测试下:
public static void main(String[] args) {
String typeName = "com.alibaba.cep.utils.A[]";
Class clazz = null;
try {
if (typeName.endsWith("[]")) {// 支持可变参数和自定义类的数组,typeName例子:"com.alibaba.cep.utils.A[]"
String remove2char = typeName.substring(0, typeName.length() - 2);
Class clazzT = Class.forName(remove2char);
clazz = Array.newInstance(clazzT, 0).getClass();// 动态创建自定义类的数组类型.
} else {
clazz = ClassUtils.classForName(typeName);
}
} catch (Exception e) {
// TODO: handle exception
}
FastClass fc = FastClass.create(Demo.class);
System.out.println(fc.getMethod("test", new Class[] { clazz }));
}
欢迎提供更好的API调用实现方案。