我这里需要一点帮助,如果你有任何想法告诉我如何解决我的问题。
假设我有这样一个类:
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)
,如果它不在有效范围内等。