从dir()结果中为getter / setter过滤jython生成的属性字段

时间:2012-10-10 16:37:19

标签: jython

我今天在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并且可能产生误报,必须避免。

1 个答案:

答案 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...