我今天在jython中使用java对象遇到了一个问题,因为jython正在尝试智能并自动为(简单)getter / setter方法创建属性 - 对于每个方法,一个带有前导get
/ {{的字段1}}删除并创建转换为小写的下一个字母:
set
最后一行总结了我的问题 - //java code
class MyClass {
public List<Thing> getAllThings() { ... }
public List<Thing> getSpecificThings(String filter) { ... }
public void setSomeThing(SomeThing x) { ... }
[...]
}
#jython code
obj = MyClass()
hasattr(obj, "allThings") #-> True
hasattr(obj, "specificThings") #-> False because getSpecificThings has a param
hasattr(obj, "someThing") #-> False BUT
"someThing" in dir(obj) #-> True
的结果包含这些字段(即使在dir
而不是obj.class
上执行)。我需要一个可在对象上调用的所有方法的列表,对于我的对象,它基本上是没有这些属性的obj
的结果,并被过滤以排除从dir
继承的所有东西和以下划线开头的东西(目的)这是将一些python类自动转换为java等价物,例如dicts to Maps)。从理论上讲,我可以使用不包含它们的java.lang.Object
,但这意味着我必须递归地评估基类'__dict__
,我想避免这种情况。我目前正在做的是查看属性是否实际存在,然后检查它是否具有__dict__
属性(意味着它是一个方法),除了生成的属性之外,每个argslist
条目都是如此:
dir
这种方法的问题在于,所讨论的对象是bean的接口,而getSomething方法通常从数据库中提取数据,因此for entry in dir(obj):
#skip things starting with an underscore or inherited from Object
if entry.startswith("_") or entry in dir(java.lang.Object): continue
#check if the dir entry is a fake setter property
if not hasattr(obj, entry): continue
#check if the dir entry has an argslist attribute (false for getter props)
e = getattr(obj, entry)
if not hasattr(e, "argslist"): continue
#start actual processing of the entry...
对属性的调用会使数据库往返,这可能需要多个秒和浪费大量的记忆。
我可以阻止jython生成这些属性吗?如果没有,是否有人知道我如何过滤掉属性而不首先访问它们?我唯一能想到的是检查getattr
是否包含一个名为dir
/ get
的方法,但这似乎是hackish并且可能产生误报,必须避免。
答案 0 :(得分:0)
答案比预期的要容易。虽然对象实例的hasattr
属性为True
,但如果所讨论的get方法不是静态的,则对象类为False
- 该类没有属性,因为您无法在其上执行该方法。更新后的循环现在如下所示:
for entry in dir(obj):
#skip things starting with an underscore or inherited from Object
if entry.startswith("_") or entry in dir(java.lang.Object): continue
#check if the dir entry is a fake property
if not hasattr(obj.class, entry): continue
#check if the dir entry has an argslist attribute (false if not a method)
e = getattr(obj, entry)
if not hasattr(e, "argslist"): continue
#start actual processing of the entry...