需求场景:根据一个配置,找到一个包含可变参数的方法
知识点:
- 可变参数作为方法参数类型在反射如何表达(可变参数类型是数组)
- 自定义类如何动态构造一个数组类型
场景举例:要求找到Demo类的test方法,demo对应spring bean id,无需关注,配置如下:
<invoker target="demo.test">
<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调用实现方案。
分享到:
相关推荐
- 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一种对象,可以通过反射创建和操作数组。 ...
- **创建数组**: - 使用`new`关键字为数组分配内存空间。 - 例如:`int[] arr = new int[5];` - **初始化数组**: - 可以在声明时直接初始化,也可以使用循环等方式初始化。 - 例如:`int[] arr = {1, 2, 3, 4...
- 可变参数允许调用者传递任意数量的同类型参数。 - 定义在后面是为了兼容其他参数的使用。 **16. 绝对路径和相对路径的区别** - **绝对路径**:包含从根目录开始的完整路径信息。 - **相对路径**:相对于当前工作...
- List: ArrayList(可变大小)、LinkedList(链表)。 - Set: HashSet(不重复元素)。 - Map: HashMap(key-value对)。 #### 二、进阶技术与实践 **2.1 异常处理** - **异常分类** - 检查异常: 必须处理的异常。 ...
- 当子类重写父类的方法时,方法的签名(包括返回类型和参数列表)必须完全一致。 - **7.3.2 多态的分类** - 静态多态:方法重载。 - 动态多态:方法覆盖。 - **7.3.3 运行时多态的三原则** - 方法重写。 - ...
- **可变参数**:可变参数允许多个同类型的参数作为方法的输入,它们在内存中被表示为数组。调用时,编译器会自动创建数组并传递给方法。 - **增强for循环(foreach)**:适用于遍历数组或实现了Iterable接口的...
- Java允许使用可变参数,即形参类型后跟三个点`...`。 - 可变参数必须位于参数列表的最后,因为其他参数的数量是固定的。 - 示例代码说明其使用方式及其原因。 **绝对路径和相对路径的区别** - **绝对路径**:包含...
文件`LSCreateModel-master`很可能包含了实现这个功能的源代码,包括可能的扩展方法、模型类和示例用法。在实际使用时,你可以导入这个库到你的项目中,然后通过调用提供的API来快速创建基于JSON的模型实例。 总的...
- 可变参数允许一个方法接受不定数量的相同类型参数。 - 定义在最后是为了确保方法调用时参数顺序正确。 **绝对路径和相对路径的区别** - 绝对路径是从根目录开始的完整路径。 - 相对路径是从当前目录开始的路径,...
- 动态创建对象:newInstance()方法,获取构造器并创建对象。 - 访问成员:获取和设置字段,调用方法。 8. **网络编程**: - Socket编程:客户端和服务端的建立连接,数据传输。 - URL和URLConnection:访问...
- 可变参数(`...`)必须位于参数列表的最后,以避免与固定数量参数混淆,并确保可变参数只能出现在最后。 **16. 绝对路径和相对路径的区别** - **绝对路径**: 从根目录开始的完整路径。 - **相对路径**: 相对于...
- 可变参数则允许向方法传递不定数量的参数。 5. **枚举类**: - 介绍了枚举类型的基本概念,以及如何在Java中定义和使用枚举。 6. **反射技术**: - 反射是指在运行时动态地获取类的信息以及动态调用对象的...
`params`关键字在C#中是一个非常有用的特性,它允许方法接收可变数量的参数。这种参数被称为“参数数组”,它提供了一种灵活的方式来传递任意数量的相同类型的参数给方法。使用`params`关键字时,开发者不需要预先...
- **符号(Symbol)**:不可变字符串,通常用于哈希表的键。 - **正则表达式**:模式匹配和文本搜索的强大工具。 #### 五、代码块和迭代器 - **代码块(Block)**: - 定义和使用代码块的方法。 - 代码块与对象的...
【C#基础知识详解】 ... - 反射允许运行时检查和操作程序集、类型、成员等信息,动态创建对象、调用方法等。 以上是对C#中25个基础概念的详细解释,理解并掌握这些概念是C#编程的基础,有助于编写高效、稳定的代码。
- **String类**:String类中的字符序列是不可变的,因此String类也是final的。 ##### 7.7 抽象类 - 包含一个或多个抽象方法的类。 - 不能直接实例化抽象类,但可以作为其他类的父类。 ##### 7.8 接口(模板方法模式...
- 反射允许程序在运行时检查类的信息,如类名、属性、方法等,并动态创建对象和调用方法。 10. **设计模式** - 在Java开发中,设计模式是一种解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式等。 ...
- **方法可变长参数**:允许方法接受可变数量的参数。 - **自动封箱和自动解封**:简化了基本类型和包装类之间的转换。 - **枚举类型**:提供了更安全、更易于使用的枚举类型。 - **泛型**:提供类型安全的集合。 - ...
- **重载(Overloading)**:在一个类中定义了多个同名的方法,但参数列表不同(参数类型、数量或顺序不同)。 - **重写(Overriding)**:子类覆盖父类中的方法,要求方法名、参数列表、返回类型完全一致(除了父类...