Доступ к статическим Java-методам в Python через jython - PullRequest
4 голосов
/ 25 ноября 2010

В настоящее время я пытаюсь получить доступ к статическому классу в Java, в Python. Я импортирую как обычно, затем я пытаюсь получить экземпляр класса Java-класса.

from com.exmaple.util import Foo

Foo. __class___.run_static_method()

Это не похоже на работу. предложения? Что я делаю неправильно.

Ответы [ 5 ]

1 голос
/ 18 июня 2013

Я тоже столкнулся с этой проблемой.Есть ошибка, о которой другие ответчики не знают.Если Java class не имеет ключевого слова public, его статические методы не будут доступны для Jython.Это сбивает с толку, поскольку оно не зависит от того, являются ли сами методы общедоступными, и других способов доступа к не явно публичной работе класса, таких как создание экземпляров.Итак, сделайте это:

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

, а не это:

class foo {
    public static void bar() { ... }
}
1 голос
/ 24 июля 2012

Я столкнулся с этим с классом, содержащим только статические методы:

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

Добавление фиктивного конструктора помогло в моем случае.Я предполагаю, что это из-за природы питонов, где классы на самом деле уже являются объектами (есть длинный пост о метаклассах, дающий некоторые подробности о понимании классов в python, его стоит прочитать, хотя это уже другая тема), иjython пытается сделать класс объектом перед запуском функции, хотя она статическая.Если бы это было так, это могло бы быть отчетом об ошибке.(Я тестирую на jython2.5).

update : я не считаю свою теорию вероятной, поскольку я считаю, что в Java также есть некоторые чисто статические классы.Однако решение решило проблему дважды.

с помощью фиктивного конструктора:

public class foo {

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

     public static void bar() {
         ...
     }

}

1 голос
/ 25 ноября 2010

Полагаю, вы создаете экземпляр класса и просто вызываете метод для этого.

from com.example.util import Foo

foo = Foo()
foo.run_static_method()

Предполагается, что просто выполнение Foo.run_static_method() не работает.

1 голос
/ 25 ноября 2010

Это работает как в следующем примере:

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 голос
/ 25 ноября 2010

Попробуйте использовать

Foo.run_static_method()
...