我需要一些帮助,告诉我你是否知道如何解决我的问题。
假设我有这个课程:
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]+"();");
这会有所帮助,并阻止我编写数十行代码。
再次感谢有帮助的人! ;)
答案 0 :(得分: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这是一个专为此而设计的库...
答案 1 :(得分:0)
您可以使用反射API和Method.invoke
:
答案 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)
等。