传递Argument作为要调用的对象

时间:2013-09-02 10:38:51

标签: java reflection

    String className = "com.endpoints.EndPointImpl"; 
    String methodName = "add";
    String args = "2,3";


    try {

        Class<?> clas = Class.forName(className);
        Object obj = Class.forName(className).newInstance(); 
        java.lang.reflect.Method method = null;
        //Type[] types;

        for(java.lang.reflect.Method m :obj.getClass().getMethods())
        {
            if(m.getName().equals(methodName))
            {
                method = m;
                //types = m.getParameterTypes();
                break;
            }
        }

//java.lang.reflect.Method method = clas.getDeclaredMethod(methodName,t);


        Object[] strarr =  args.split(",");

        Object retobj = method.invoke(obj,strarr );

如何传递参数来调用现在它生成异常我知道为什么但是我怎么能传递两个int

加(在,INT)

P.S。

ArrayList<Object> objArr = new ArrayList<Object>();

        for(java.lang.reflect.Method m :obj.getClass().getMethods())
        {
            if(m.getName().equals(methodName))
            {
                method = m;

                int index = 0;
                for(Type type :m.getGenericParameterTypes())
                {
                    if(type.getClass().equals("Integer"))
                    {
                        objArr.add(Integer.parseInt(strarr[index]));
                    }
                    else if(type.getClass().equals("Float"))
                    {
                        objArr.add(Float.parseFloat(strarr[index]));
                    }
                    index++;
                }

然后在调用中传递objArr或者有一个更好的解决方案,我还想询问是否可以创建一个通用的转换函数,以便它将字符串转换为指定的类型

2 个答案:

答案 0 :(得分:1)

编写代码时,应始终问自己应该做什么。回答这个问题的最好方法是阅读Javadoc。此外,当您遇到异常时,请始终提供完整的堆栈跟踪。您不需要整个for循环。

使用Method#getDeclaredMethod(String, Class[])。它接受两个参数

name - the name of the method
parameterTypes - the parameter array

如果方法名为add且接受两个int参数,请将其称为

java.lang.reflect.Method method = clas.getDeclaredMethod("add", int.class, int.class);

int.class参数是该方法所采用的参数类型。

您可以使用

invoke方法
method.invoke(object, 3, 3);

其中object是声明add(int, int)方法的类的实例。如果此方法为static,则可以改为null。两个3是您将传递的int参数值,就像您直接调用该方法一样。

object.add(3,3);

如果你收到Strings作为参数传入,你需要先抛出它们

String args = "2,3";
String[] strarr =  args.split(",");
// with no other validation
int[] values = new int[strarr.length];
for (int i = 0; i < strarr.length; i++) {
    values[i] = Integer.parseInt(strarr[i]);
}

method.invoke(object, values);

显然,在拆分和解析字符串时执行适当的验证。

答案 1 :(得分:0)

  1. 替换此语句String args =“2,3”; with Integer args = {10,20};
  2. 删除此语句Object [] strarr = args.split(“,”);
  3. 替换对象retobj = method.invoke(obj,strarr); with Object retobj = method.invoke(obj,args);