通过jython在Python中访问静态Java方法

4

我目前正在尝试在Python中访问Java中的静态类。我像平常一样进行导入,然后尝试获取Java类的类实例。

from com.exmaple.util import Foo

Foo. __class___.run_static_method()

这似乎不起作用,有什么建议吗?我做错了什么。

在Java中,你可以这样做:Foo.someStaticMethod()。这对你有效吗?或者在jython中不起作用吗? - thejh
请提供更多关于正在发生的事情的细节。检查您在调用方和被调用类中是否使用了相同的方法名称。http://bugs.jython.org/issue1002 - Puspendu Banerjee
5个回答

2
尝试使用。
Foo.run_static_method()

1

它的工作方式就像这个例子:

Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_22
Type "help", "copyright", "credits" or "license" for more information.
>>> import java.lang
>>> java.lang.System.getProperty('user.dir')
u'/home/vinay'

请注意,getProperty 是静态类 java.lang.System 的静态方法。

1
我也遇到过这个问题。其他回答者不知道的是,Java类如果没有关键字public,则其静态方法将无法在Jython中使用。这很令人困惑,因为它与方法本身是否公共无关,而访问未明确公开的类的其他方法也有效,例如实例化。总之,请执行以下操作:
public class foo {
    public static void bar() { ... }
}

不要这个:

class foo {
    public static void bar() { ... }
}

1

我想你需要创建一个类的实例,然后在该实例上调用方法。

from com.example.util import Foo

foo = Foo()
foo.run_static_method()

假设仅执行Foo.run_static_method()无法正常工作。

1

我在一个只包含静态方法的类中遇到了这个问题:

public class foo {
     public static void bar() {
         ...
     }
}

在我的情况下,添加一个虚拟构造函数是有帮助的。我猜这是因为Python的特性是类实际上已经是对象了(关于元类在Python中的理解有一篇长文,提供了一些关于类的理解,值得一读,尽管它是一个不同的主题),而jython在运行函数之前尝试将类变成一个对象,即使它是静态的。如果这是真的,那可能是一个bug报告。(我正在测试jython2.5)

更新:我不认为我的理论是正确的,因为我相信Java也有一些纯静态的类。然而,这个解决方案已经两次解决了问题。

使用虚拟构造函数:

public class foo {

     public foo() {}   //!This dummy constructor did the trick for me

     public static void bar() {
         ...
     }

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接