【问题标题】:Accessing static java methods in Python through jython通过 jython 在 Python 中访问静态 java 方法
【发布时间】:2023-03-26 14:36:01
【问题描述】:

我目前正在尝试在 python 中访问 java 中的静态类。我正常导入,然后尝试获取 java 类的类实例。

from com.exmaple.util import Foo

Foo. __class___.run_static_method()

这似乎不起作用。建议?我究竟做错了什么。

【问题讨论】:

  • 在 Java 中,您会这样做:Foo.someStaticMethod() 这对您有用还是不适用于 jython?
  • 请提供更多关于到底发生了什么的细节。检查你在调用者和被调用类中没有使用相同的method_name。bugs.jython.org/issue1002

标签: java python jython


【解决方案1】:

尝试使用

Foo.run_static_method()

【讨论】:

    【解决方案2】:

    我想你创建了一个类的实例,然后调用它的方法。

    from com.example.util import Foo
    
    foo = Foo()
    foo.run_static_method()
    

    假设只做Foo.run_static_method() 是行不通的。

    【讨论】:

      【解决方案3】:

      它像这个例子一样工作:

      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的静态方法。

      【讨论】:

        【解决方案4】:

        我遇到了一个只包含静态方法的类:

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

        添加一个虚拟构造函数对我来说很有帮助。我想这是因为 python 的性质,类实际上已经是对象(有一个关于元类的long post 提供了一些关于 python 中的类理解的详细信息,尽管它是一个不同的主题,但它值得一读),并且 jython 试图使在运行函数之前对对象进行分类,即使它是静态的。如果这是真的,那可能是一个错误报告。 (我在 jython2.5 上测试)。

        更新:我认为我的理论不太可能,因为我相信 Java 也有一些纯静态类。但是,该解决方案两次解决了该问题。

        使用虚拟构造函数:

        public class foo {
        
             public foo() {}   //!This dummy constructor did the trick for me
        
             public static void bar() {
                 ...
             }
        

        }

        【讨论】:

          【解决方案5】:

          我也遇到了这个问题。有一个其他回答者不知道的问题。如果 Java class 没有关键字 public,那么 Jython 将无法使用其静态方法。这很令人困惑,因为它与方法本身是否是公共的以及访问非显式公共类工作的其他方式(例如实例化)无关。总之,这样做:

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

          不是这个:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-15
            • 2011-04-17
            • 2012-03-30
            • 2017-12-15
            • 2012-10-07
            • 1970-01-01
            • 2013-10-14
            • 1970-01-01
            相关资源
            最近更新 更多