动态调用方法

时间:2013-03-05 15:46:05

标签: java reflection

我需要一些帮助,告诉我你是否知道如何解决我的问题。

假设我有这个课程:

public testClass{

    public int example1(){
    return 2;
    }
    public int example2(){
    return 0;
    }
    public int example3(){
    return 456;
    }
}

我想要一个方法,它将以与此方法相同的方式,但以动态的方式

public int methodeSwitch(int a){
   if (a==1){return method1;}
   if (a==2){return method2;}
   if (a==3){return method3;}
   return null;
}

我的问题是我有一个包含50多个字段的庞大类(dto),所以我想根据我目前使用的字段使用getter和setter(所以是的,动态的)。 我知道如何访问字段(使用java.lang.Field,wouuu),但我不知道如何通过名称(将动态创建)来转换方法。

给我一​​个暗示会很棒!

由于 法比安

编辑:澄清一下,我必须写一个基本上使用我班级每个人的方法,所以如果我可以使用像

这样的东西
useMethod("set"+fields[i]+"();");

这会有所帮助,并阻止我编写数十行代码。

再次感谢有帮助的人! ;)

3 个答案:

答案 0 :(得分:2)

您需要使用反射来从您的类中获取声明的方法。我假设这些方法存在于您要调用getter / setter的类中,并且fieldsString[]字段名称。

private Object callGet(final String fieldName) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    final Method method = getClass().getDeclaredMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
    return method.invoke(this, (Object[]) null);
}

private void callSet(final String fieldName, final Object valueToSet) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    final Method method = getClass().getDeclaredMethod("set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1), new Class[]{valueToSet.getClass()});
    method.invoke(this, new Object[]{valueToSet});
}

您还可以查看Commons BeansUtil这是一个专为此而设计的库...

答案 1 :(得分:0)

您可以使用反射API和Method.invoke

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#invoke%28java.lang.Object,%20java.lang.Object...%29

尽管我确信这样做并不是一个好习惯。

答案 2 :(得分:0)

使用反射,您可以尝试这样的事情。

public int methodeSwitch(int a)  {
    Map<Integer,String> methods = new HashMap<Integer,String>();
    methods.put(1, "example1");
    methods.put(2, "example2");
    methods.put(3, "example3");

    java.lang.reflect.Method method;
    try {
        method = this.getClass().getMethod(methods.get(a));
        return (Integer) method.invoke(this);
    } catch(Exception ex){//lots of exception to catch}
    return 0;
}

这只是一个概念证明。当然,您应该在另一个地方初始化您的动态方法(静态初始化),如果它不在有效范围内,请检查methods.get(a)等。