Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java上动态调用方法_Java_Method Invocation - Fatal编程技术网

在Java上动态调用方法

在Java上动态调用方法,java,method-invocation,Java,Method Invocation,在工作中,我们必须为客户生成一份报告,在一周内多次更改其参数。 此报告是从数据库中的单个表生成的。 例如,假设一个表有100列,我今天必须生成一个只有5列的报告,但明天我必须生成其中的95列。 考虑到这一点,我创建了一个TO类,其中包含指定表的所有列,并且我的查询将返回SELECT*FROM表中的所有列 我试图创建一个动态表单来生成报告。 我首先想到的是创建一个简单的框架,其中列的列表列为复选框,用户可以选择他想要的列,当然,可以通过一个按钮选择全部,另一个按钮取消选择全部 由于所有列的名称都与

在工作中,我们必须为客户生成一份报告,在一周内多次更改其参数。 此报告是从数据库中的单个表生成的。 例如,假设一个表有100列,我今天必须生成一个只有5列的报告,但明天我必须生成其中的95列。 考虑到这一点,我创建了一个TO类,其中包含指定表的所有列,并且我的查询将返回SELECT*FROM表中的所有列

我试图创建一个动态表单来生成报告。 我首先想到的是创建一个简单的框架,其中列的列表列为复选框,用户可以选择他想要的列,当然,可以通过一个按钮选择全部,另一个按钮取消选择全部

由于所有列的名称都与TO类的属性相同,因此我开发了以下代码,我在Google上看到了这些代码:

Class c = Test.class;

for(int i = 0; i < listOfAttributes.length; i++)
{
    auxText += String.valueOf( c.getMethod( "get" + listOfAttributes[i]).invoke( this, null ) );
}
这是我需要做的更好的方式吗

提前谢谢

Obs.:TO类的getter具有模式getAttribute\u Name


注意:这个问题与用户询问如何调用给定特定名称的某个方法的问题不同。我知道怎么做。我想问的是,这是否是解决我所描述的问题的更好方法。

我的Java有点有限,但我相信这与使用反射得到的结果差不多

c类=测试级; 对于字符串属性:ListofAttribute{ auxText+=String.valueOfc.getMethodget+attribute.invokethis,null; } 但由于这听起来像是来自潜在的不可信数据,我建议在这种情况下使用HashMap,并显式引用每个方法。首先,它明确说明了可以动态调用哪些方法。其次,它的类型更安全,编译时错误比运行时错误要好得多。第三,它可能更快,因为它完全避免了反射。大意如下:

私有静态最终HashMap方法=新HashMap; //初始化所有方法。 静止的{ methods.setFoo,Test::getFoo; 方法:立根杆,测试::getBar; //等等。 } 私有字符串invokeGetterString名称{ if methods.containsKeyname{ 返回String.valueOfmethods.getname.get; }否则{ 抛出新的NoSuchMethodException; } }
这样做听起来可能是一种严重的干性违规行为,但这种重复至少可以确保您不会意外调用无关的getter。

可能重复,就像我在注释中所说的:这个问题与用户询问如何调用给定某个名称的某个方法的问题不同。我知道怎么做。我想问的是,这是否是解决我描述的问题的更好的方法。我会收回的。我会注意到你的笔记是在我第一次查看后添加的。我想问的是,这是否是解决我描述的问题的更好方法。。。最佳实践问题通常是意见问题。我相信在这种情况下也是如此。
Class c = Test.class;
for(int i = 0; i < listOfAttributes.length; i++)
{
    auxText += String.valueOf( c.getMethod( "get" + listOfAttributes[i]).invoke( this, null ) );
}
Map<String, Method> methods = new HashMap<>();
Class c = this.getClass(); // surely?
for (PropertyDescriptor pd : Introspector.getBeanInfo(c).getPropertyDescriptors())
{
    map.put(pd.getName(), pd.getReadMethod();
}
// 
for (int i = 0; i < listOfAttributes.length; i++)
{
    Method m = methods.get(listOfAttributes[i]);
    if (m == null)
        continue;
    auxText += String.valueOf(m.invoke(this, null));
}