`

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

    博客分类:
  • 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讲义

    4.5 数组类型 87 4.5.1 理解数组:数组也是一种类型 88 学生提问:int[]是一种类型吗?怎么使用这种类型呢? 88 4.5.2 定义数组 88 4.5.3 数组的初始化 89 学生提问:能不能只分配内存空间,不赋初始值呢?89 ...

    JavaScript王者归来part.1 总数2

     6.5.1 动态创建函数--一个利用Function实现Lambda算子的例子   6.5.2 模式--函数工厂及其实例   6.6 总结   第7章 对象  7.1 什么是对象   7.2 对象的属性和方法   7.2.1 对象的内置属性   7.2.2 为...

    javaSE代码实例

    17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 ...

    Java2核心技术.part5

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part3

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part1

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7版本 ...

    Java2核心技术.part6

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part4

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part2

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java经典编程源码基础例程300.zip

    实例077 创建长度可变的数组 117 实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例...

    net学习笔记及其他代码应用

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例159 创建长度可变的数组 206 实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 ...

Global site tag (gtag.js) - Google Analytics