From: Stephane B. <Ste...@em...> - 2004-11-24 21:20:45
|
=20 I'm trying to use an instance of a java interface ( the interface is implemented in jython) in a java program. =20 Using the __tojava__ method I get a 'java instance' of the jython object = but when I try to call a method of the=20 interface from java I get a "TypeError: login() too many arguments; = expected 0 got 1" =20 here's the code I use. =20 IJavaInterface myJythonObject =3D null; =20 PythonInterpreter tInterp =3D new PythonInterpreter(); Properties tPythonProperties =3D new Properties(); tPythonProperties.setProperty("python.path", "c:/share/lib" ); PythonInterpreter.initialize(System.getProperties(), = tPythonProperties, null); =20 try { =20 File tFile =3D new File("c:/temp/test.py "); FileInputStream tFileStream =3D new FileInputStream(tFile); try { =20 tInterp.setErr(System.out); tInterp.execfile(tFileStream); tInterp.exec("x=3DTestClass()"); PyObject pObj1 =3D tInterp.get("x"); myJythonObject =3D = (IjavaInterface)pObj1.__tojava__( IjavaInterface.class); =20 myJythonObject.login(); <---------this throws = a TypeError: too many arguments } catch(Exception tEx) { System.out.println(tEx.toString()); } } =20 I have looked at previous postings on jython-user and googled the = problem but I have not found a solution=20 I'm a jython newb so I probably either missed something or made some incorrect assumptions. Should I not be using the myJythonObject like it is a java object? I can use __findattr__("login") and use the __call__ method but this = would defeat the purpose of the interface. =20 Any help would be greatly appreciated. =20 -stephane =20 |
From: Kent J. <ke...@td...> - 2004-11-25 12:53:53
|
What does your Jython implementation of IJavaInterface look like? My=20 guess is that you left off the 'self' argument to login(); i.e. in you=20 .py file you should have something like this: import IJavaInterface class MyInterface(IJavaInterface): def login(self): pass Member functions should always have at least one argument - self. If you=20 omit the 'self' argument that will cause the error you are getting. Kent Stephane Blardone wrote: > =20 >=20 > I=92m trying to use an instance of a java interface ( the interface is=20 > implemented in jython) in a java program. >=20 > =20 >=20 > Using the __tojava__ method I get a =91java instance=92 of the jython o= bject=20 > but when I try to call a method of the >=20 > interface from java I get a =93TypeError: login() too many arguments;=20 > expected 0 got 1=94 >=20 > =20 >=20 > here=92s the code I use. >=20 > =20 >=20 > IJavaInterface myJythonObject =3D null; >=20 > =20 >=20 > PythonInterpreter tInterp =3D new PythonInterpreter(); >=20 > Properties tPythonProperties =3D new Properties(); >=20 > tPythonProperties.setProperty("python.path", =93c:/share/lib" ); >=20 > PythonInterpreter.initialize(System.getProperties(),=20 > tPythonProperties, null); >=20 > =20 >=20 > try { >=20 > =20 >=20 > File tFile =3D new File("c:/temp/test.py "); >=20 > FileInputStream tFileStream =3D new FileInputStream(tFile); >=20 > try { >=20 > =20 >=20 > tInterp.setErr(System.out); >=20 > tInterp.execfile(tFileStream); >=20 > tInterp.exec("x=3DTestClass()"); >=20 > PyObject pObj1 =3D tInterp.get("x"); >=20 > myJythonObject =3D=20 > (IjavaInterface)pObj1.__tojava__( IjavaInterface.class); >=20 > =20 >=20 > myJythonObject.login(); =DF-------this throw= s a=20 > TypeError: too many arguments >=20 > } >=20 > catch(Exception tEx) { >=20 > System.out.println(tEx.toString()); >=20 > } >=20 > } >=20 > =20 >=20 > I have looked at previous postings on jython-user and googled the=20 > problem but I have not found a solution >=20 > I=92m a jython newb so I probably either missed something or made some=20 > incorrect assumptions. >=20 > Should I not be using the myJythonObject like it is a java object? >=20 > I can use __findattr__(=93login=94) and use the __call__ method but thi= s=20 > would defeat the purpose of the interface. >=20 > =20 >=20 > Any help would be greatly appreciated. >=20 > =20 >=20 > -stephane >=20 > =20 >=20 |