2010-11-25 46 views
4

J'essaie actuellement d'accéder à une classe statique dans java, dans python. J'importe comme d'habitude, puis j'essaye d'obtenir l'instance de classe de la classe java.Accéder aux méthodes java statiques en Python via jython

from com.exmaple.util import Foo 

Foo. __class___.run_static_method() 

Cela ne semble pas fonctionner. suggestions? Qu'est-ce que je fais mal.

+0

En Java, vous feriez ceci: 'Foo.someStaticMethod()' Est-ce que le travail pour vous ou ne pas travailler avec Jython ? – thejh

+0

Veuillez fournir plus de détails sur ce qui se passe exactement. Vérifiez que vous n'utilisez pas la même méthode nom_appel dans l'appelant et la classe appelée.http: //bugs.jython.org/issue1002 –

Répondre

1

Essayez d'utiliser

Foo.run_static_method() 
1

Je suppose que vous créez une instance de la classe et juste appeler la méthode sur ce point.

from com.example.util import Foo 

foo = Foo() 
foo.run_static_method() 

En supposant faire juste Foo.run_static_method() ne fonctionne pas.

1

Il fonctionne comme cet exemple:

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' 

Notez que getProperty est une méthode statique de classe statique java.lang.System.

1

J'ai couru dans cette classe avec une seule tenue des méthodes statiques:

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

Ajout d'un constructeur factice aidé dans mon cas. Je suppose que cela est dû au fait de la nature pythons étaient classes sont des objets en fait déjà (il y a un long post au sujet métaclasses donnant quelques détails sur la compréhension de la classe en python, son digne d'une lecture eventhough il est un autre sujet), et Jython essayer de faire la une classe objet avant d'exécuter la fonction même s'il est statique. Si ce serait vrai, cela pourrait être un rapport de bogue. (Je suis en train de tester sur jython2.5).

mise à jour: Je ne considère pas que mon choix soit probable car je crois que Java a aussi des classes statiques pures. Cependant, la solution a résolu le problème deux fois.

avec le constructeur mannequin:

public class foo { 

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

    public static void bar() { 
     ... 
    } 

}

0

je suis tombé sur ce problème aussi. Il y a un gotcha que les autres répondeurs ignorent. Si la classe Java n'a pas le mot-clé public, ses méthodes statiques ne seront pas disponibles pour Jython. Ceci est déroutant car il est indépendant du fait que les méthodes elles-mêmes sont publiques ou d'autres moyens d'accéder au travail de classe non explicitement public, tel que l'instanciation. En résumé, faites ceci:

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

pas:

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