在单个实用程序方法中使用反射来调用类的不同方法的最佳方法

时间:2017-05-17 05:37:13

标签: java reflection

我有一个包含多个方法的类,它接受不同的参数并返回不同的类型,如下面的示例中的类foo: -

class foo{
    public void A(int a , int b){
      // do somthing.
    }

    public String B(int a , String b){
        // do somthing.
        return "a";
    }

    public Object C(String a , String b){
        // do somthing.
        return null;
    }

    public int D(Long a , String b , String c){
        // do somthing.
        return 1;
    }
}
public class bar {

    public static void main(String[] args) {

        try {
            Class c = Class.forName("foo");
            Object t = c.newInstance();
            Method[] methods = c.getDeclaredMethods();
            for(Method m : methods){
                String methodName = m.getName();
                if(methodName.equalsIgnoreCase("A")) {
                    // How to call method with its argument and return the result using reflection.
                    m.invoke(t,);
                    break;
                }
            }

        }catch (InstantiationException e){

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // Handle any exceptions thrown by method to be invoked.
            e.printStackTrace();
        }

    }

}

现在我想创建一个实用方法,它接受方法名称和参数,并使用反射调用相应的方法。让我知道如何使用泛型实用程序方法传递不同的方法参数并从反射代码返回结果(它可以返回int,string,object,如示例中所示)。

1 个答案:

答案 0 :(得分:2)

在示例代码中,Method类的public Object invoke(Object obj, Object... args)方法将varargs作为第二个参数。所以你可以用这种方式调用A(int,int)方法:

m.invoke(t, 3, 4);

但这不能解决你的问题。

  

让我知道如何使用泛型实用程序方法传递不同的方法参数并从反射代码返回结果(它可以返回int,string,object,如示例中所示)。

这是一个非常糟糕的设计,因为你想使用反射来做非常具体的事情:用一个入口点方法调用具有特定参数的特定方法。
它容易出错且速度较慢。

例如,您可以在入口点方法中使用包含2个参数的方法:

  • 方法名称的字符串
  • 参数值的对象的varargs。

如何使用它? 没有类型检查和计算在声明的方法中传递的每个参数的位置:非常容易出错 此外,如果您在使用的类中添加/删除或更改参数,您的反射代码将编译正常,而在运行时它将引发异常。

这似乎不适合反思。