首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态调用方法

动态调用方法
EN

Stack Overflow用户
提问于 2013-03-05 23:46:05
回答 3查看 210关注 0票数 1

我需要一点帮助,如果你有什么办法解决我的问题,请告诉我。

假设我有这样一个类:

代码语言:javascript
复制
public testClass{

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

我想要一个方法,它将做同样的事情,这个方法,但在一个动态的方式

代码语言:javascript
复制
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),但我不知道如何根据方法的名称(将动态创建)来强制转换方法。

仅仅给我一个提示就太棒了!

谢谢Fabien

编辑:为了清楚起见,我必须编写一个方法,这个方法基本上使用了我的类的每个setter方法,所以如果我可以使用像这样的东西

代码语言:javascript
复制
useMethod("set"+fields[i]+"();");

这将是有帮助的,并避免我写几十行代码。

再次感谢那些帮助我们的人!;)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 23:58:35

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

代码语言:javascript
复制
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,这是一个专门为此而设计的库……

票数 2
EN

Stack Overflow用户

发布于 2013-03-05 23:51:34

您可以使用反射接口和Method.invoke

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

事件,但我确信这样做不是一个好的做法。

票数 0
EN

Stack Overflow用户

发布于 2013-03-06 00:00:49

使用反射,你可以尝试这样的东西。

代码语言:javascript
复制
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)是否在有效范围内等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15228092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档