我正在将一些python代码转换为java,并且我需要调用一个对象的方法,但在运行时才知道哪些方法。在python中,我通过在我的对象上使用getattr并传递一个字符串来解决这个问题,该字符串是我的方法的名称。你会如何在Java中做类似的事情?
答案 0 :(得分:12)
Class.getField
是你的朋友。它可能不会非常简单,因为Python是动态类型的,而Java是静态类型的(除非事先知道字段的类型。)
编辑:如何翻译这些例子。 http://effbot.org/zone/python-getattr.htm
属性查找
的Python
//normal
value = obj.attribute
//runtime
value = getattr(obj, "attribute")
爪哇
//normal
value = obj.attribute;
//runtime
value = obj.getClass().getField("attribute").get(obj);
方法调用
的Python
//normal
result = obj.method(args)
//runtime
func = getattr(obj, "method")
result = func(args)
爪哇
//normal
result = obj.method(args);
//runtime
Method func = obj.getClass().getMethod("method", Object[].class);
result = func.invoke(obj, args);
在更简单的情况下,您需要知道您是否有字段或方法。因为它们可以具有相同的名称。此外,方法可能会重载,因此您需要知道所需的方法签名。
如果你不关心你得到哪种方法或字段,你可以很容易地将它作为辅助方法实现。
答案 1 :(得分:0)
您可以启动here以了解Java反射。
答案 2 :(得分:0)
您可以使用java reflection,但没有完全相同的getattr
。
答案 3 :(得分:0)
在Java中,你使用Reflection API(这通常很麻烦)。
Apache Commons BeanUtils项目中的 MethodUtils
可能会让它更容易使用,尽管对于像这样简单的东西来说这是一个非常大的依赖。
答案 4 :(得分:0)
您应该使用Reflection API。由于纯API有点......不可接近,因此您应该查看commons beanutils或reflections等帮助程序。
答案 5 :(得分:0)
处理此问题的最简单方法是在Java类中创建一个Map对象,并继续添加名称值对并相应地对其进行检索,尽管它可能不支持setAttr支持的不同类型。