动态调用方法



我这里需要一点帮助,如果你有任何想法告诉我如何解决我的问题。

假设我有这样一个类:

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;
}

我的问题是,我有一个巨大的类(dto)与50+字段,所以我想使用getter和setter取决于字段,我现在使用(所以是的,动态)。我知道如何访问字段(使用java.lang)。字段,wouuu),但我不知道如何通过其名称(将动态创建)强制转换方法。

给我个提示就好了!

谢谢法比

编辑:为了澄清,我必须编写一个方法,基本上使用我的类的每个setter,所以如果我可以使用像 这样的东西
useMethod("set"+fields[i]+"();");

这很有帮助,可以避免我写几十行代码。

再次感谢你的帮助!div;)

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

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这是一个专门做这些的库

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

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html调用% 28 java . lang . object, % 20 java . lang . object…% 29日

事件,虽然我相信这不是一个好的做法,这样做。

使用反射,您可以尝试这样做。

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),如果它不在有效范围内等。

相关内容

  • 没有找到相关文章

最新更新