`

反射-方法包含可变参数&自定义类动态创建数组类型

    博客分类:
  • Java
 
阅读更多

需求场景:根据一个配置,找到一个包含可变参数的方法

知识点:

  • 可变参数作为方法参数类型在反射如何表达(可变参数类型是数组)
  • 自定义类如何动态构造一个数组类型

场景举例:要求找到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调用实现方案。

 

分享到:
评论

相关推荐

    java加强笔记

    - 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一种对象,可以通过反射创建和操作数组。 ...

    CoreJavaNoteBook

    - **创建数组**: - 使用`new`关键字为数组分配内存空间。 - 例如:`int[] arr = new int[5];` - **初始化数组**: - 可以在声明时直接初始化,也可以使用循环等方式初始化。 - 例如:`int[] arr = {1, 2, 3, 4...

    Java经典面试题+答案(带书签)pdf

    - 可变参数允许调用者传递任意数量的同类型参数。 - 定义在后面是为了兼容其他参数的使用。 **16. 绝对路径和相对路径的区别** - **绝对路径**:包含从根目录开始的完整路径信息。 - **相对路径**:相对于当前工作...

    Java 学习路线规划图.pdf

    - List: ArrayList(可变大小)、LinkedList(链表)。 - Set: HashSet(不重复元素)。 - Map: HashMap(key-value对)。 #### 二、进阶技术与实践 **2.1 异常处理** - **异常分类** - 检查异常: 必须处理的异常。 ...

    Java入门学习笔记

    - 当子类重写父类的方法时,方法的签名(包括返回类型和参数列表)必须完全一致。 - **7.3.2 多态的分类** - 静态多态:方法重载。 - 动态多态:方法覆盖。 - **7.3.3 运行时多态的三原则** - 方法重写。 - ...

    张孝祥.doc

    - **可变参数**:可变参数允许多个同类型的参数作为方法的输入,它们在内存中被表示为数组。调用时,编译器会自动创建数组并传递给方法。 - **增强for循环(foreach)**:适用于遍历数组或实现了Iterable接口的...

    Java极品学习资料

    - Java允许使用可变参数,即形参类型后跟三个点`...`。 - 可变参数必须位于参数列表的最后,因为其他参数的数量是固定的。 - 示例代码说明其使用方式及其原因。 **绝对路径和相对路径的区别** - **绝对路径**:包含...

    swift-macapp根据json字符串创建模型类自动判断类型

    文件`LSCreateModel-master`很可能包含了实现这个功能的源代码,包括可能的扩展方法、模型类和示例用法。在实际使用时,你可以导入这个库到你的项目中,然后通过调用提供的API来快速创建基于JSON的模型实例。 总的...

    Java经典问题答案(带书签).pdf

    - 可变参数允许一个方法接受不定数量的相同类型参数。 - 定义在最后是为了确保方法调用时参数顺序正确。 **绝对路径和相对路径的区别** - 绝对路径是从根目录开始的完整路径。 - 相对路径是从当前目录开始的路径,...

    面向后台,j2se部分都是基础,主要学习: 面向对-Java-Summary-of-Basic-Learning.zip

    - 动态创建对象:newInstance()方法,获取构造器并创建对象。 - 访问成员:获取和设置字段,调用方法。 8. **网络编程**: - Socket编程:客户端和服务端的建立连接,数据传输。 - URL和URLConnection:访问...

    经典的问题

    - 可变参数(`...`)必须位于参数列表的最后,以避免与固定数量参数混淆,并确保可变参数只能出现在最后。 **16. 绝对路径和相对路径的区别** - **绝对路径**: 从根目录开始的完整路径。 - **相对路径**: 相对于...

    30天轻松掌握javaweb 课堂笔记完整版

    - 可变参数则允许向方法传递不定数量的参数。 5. **枚举类**: - 介绍了枚举类型的基本概念,以及如何在Java中定义和使用枚举。 6. **反射技术**: - 反射是指在运行时动态地获取类的信息以及动态调用对象的...

    winform 方法参数 params源码

    `params`关键字在C#中是一个非常有用的特性,它允许方法接收可变数量的参数。这种参数被称为“参数数组”,它提供了一种灵活的方式来传递任意数量的相同类型的参数给方法。使用`params`关键字时,开发者不需要预先...

    Ruby程序设计高级教程

    - **符号(Symbol)**:不可变字符串,通常用于哈希表的键。 - **正则表达式**:模式匹配和文本搜索的强大工具。 #### 五、代码块和迭代器 - **代码块(Block)**: - 定义和使用代码块的方法。 - 代码块与对象的...

    你必须知道的C#的25个基础概念

    【C#基础知识详解】 ... - 反射允许运行时检查和操作程序集、类型、成员等信息,动态创建对象、调用方法等。 以上是对C#中25个基础概念的详细解释,理解并掌握这些概念是C#编程的基础,有助于编写高效、稳定的代码。

    JAVA核心技术

    - **String类**:String类中的字符序列是不可变的,因此String类也是final的。 ##### 7.7 抽象类 - 包含一个或多个抽象方法的类。 - 不能直接实例化抽象类,但可以作为其他类的父类。 ##### 7.8 接口(模板方法模式...

    java小宝库-面试帮手

    - 反射允许程序在运行时检查类的信息,如类名、属性、方法等,并动态创建对象和调用方法。 10. **设计模式** - 在Java开发中,设计模式是一种解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式等。 ...

    Core Java -sd0808-chuanjiang2

    - **方法可变长参数**:允许方法接受可变数量的参数。 - **自动封箱和自动解封**:简化了基本类型和包装类之间的转换。 - **枚举类型**:提供了更安全、更易于使用的枚举类型。 - **泛型**:提供类型安全的集合。 - ...

    华为java面试题

    - **重载(Overloading)**:在一个类中定义了多个同名的方法,但参数列表不同(参数类型、数量或顺序不同)。 - **重写(Overriding)**:子类覆盖父类中的方法,要求方法名、参数列表、返回类型完全一致(除了父类...

Global site tag (gtag.js) - Google Analytics