1

我需要一点帮助,如果您知道如何解决我的问题,请告诉我。

假设我有这门课:

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]+"();");

这会很有帮助,并且可以防止我编写数十行代码。

再次感谢帮助的人!;)

4

3 回答 3

2

您需要使用反射从您的类中获取声明的方法。我假设这些方法存在于您要在其上调用 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,这是一个专为执行此操作而设计的库...

于 2013-03-05T15:58:34.630 回答
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

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

于 2013-03-05T15:51:34.357 回答
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)它是否不在有效范围内等。

于 2013-03-05T16:00:49.477 回答