Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jython,只使用Python和Java中的方法?_Java_Python_Jython - Fatal编程技术网

Jython,只使用Python和Java中的方法?

Jython,只使用Python和Java中的方法?,java,python,jython,Java,Python,Jython,在阅读和使用时,它假设我们有一个完整的对象定义,其中包含从python到java的类和映射(代理)对象 是否可以只从python中的一段代码导入一个方法(不是在类中定义的,而是使用内部python类),而不将其包装在类定义中(不使用上述工厂范例) 我想从myPyFile执行某种类型的,从java导入myMethod,然后直接从java使用myMethod(可能是静态方法?)?但是,如果这是可能的,我还没有找到任何关于如何做到这一点的线索(本文中描述的接口内容可能仍然是告诉Java如何使用myMe

在阅读和使用时,它假设我们有一个完整的对象定义,其中包含从python到java的类和映射(代理)对象

是否可以只从python中的一段代码导入一个方法(不是在类中定义的,而是使用内部python类),而不将其包装在类定义中(不使用上述工厂范例)

我想从myPyFile执行某种类型的
,从java导入myMethod
,然后直接从java使用myMethod(可能是静态方法?)?但是,如果这是可能的,我还没有找到任何关于如何做到这一点的线索(本文中描述的接口内容可能仍然是告诉Java如何使用myMethod所必需的?)

致以最良好的祝愿

编辑:我现在处理的是Jython 2.5.2,因此它可能依赖于版本,将来会更容易?

编辑:以下回复丹尼尔:

下面是一个示例代码,用于重现我得到的错误,并从您的有用回复中获得一个工作示例

(好吧,再添加一个关于从一个生成的Python/Jython结果映射回Java对象的问题)

(@Joonas,对不起,我已经修改了我的代码,现在我无法返回到以前的错误)

编辑

对于内部问题(内部评论),部分回答自己:
(事实上,我觉得我的答案和代码很难看,但它很有效,而且似乎可以解元组。我不知道是否有更好的Jythonic方法,如果有,我真的很感兴趣:))


编辑:

回答我自己关于“生成a:”java.lang.ClassCastException:org.python.core.PySingleton不能转换到MyInterface“…我的大部分误解和错误都是由于我忘记从python部分处理java这一事实!(见上面我的代码,我没有更正这个事实,因为这不是我的主要问题,以它的实际形式,这是一个关于这个主要问题的有效答案,非常感谢丹尼尔和乔纳斯帮助我理解)因此,对于工厂范例,应该不要忘记将适当的导入添加到其Python文件中:

from testjython.interfaces import MyInterface #// defining method inside a MyInterface.java

class MyClass(MyInterface):
    [...]
我遇到的另一个困难是正确处理进口和包装。
顺便说一句,将此代码添加到上面的代码将产生一个类型错误:无法转换为org.python.core.PyList,但这是另一个问题…

仅导入一个方法是不可能的,因为在Java中,方法(或函数)不是一级对象,也就是说,如果不首先引用某个类(或接口),就无法引用一个方法。即使静态方法也包含在类中,您也可以通过类对象引用它们

但是,您可以非常接近Jython 2.5.2中介绍的解决方案:Jython函数直接作为单个抽象方法Java接口的实现工作(请参阅)。因此,您可以用Java定义接口-它必须只包含一个方法定义:

interface MyInterface {
    int multiply(int x, int y);
}
加上Jython中的类似内容:

myFunction = lambda x, y : x * y
并将其用作Java中的
MyInterface
。您仍然需要使用某种工厂模式,如您链接到的文章中所述,才能将Jython函数用于Java,但类似的方法是可行的(可能包含错误,但其思想是):


您可以使用
PyObject.\uuuu调用\uuuu(Object…args)
来调用任何可调用的Python对象。您可以从java端获取表示函数的PyFunction,就像您示例获取Python employee类一样

或者,您可以通过对从Python解释器检索到的函数调用
\uu to java\uu(interface.class)
将其隐藏在java端的单个方法接口后面。 详细示例(实际测试!): python文件:

def tmp():
    return "some text"
爪哇:

输出:

class org.python.core.PyFunction
some text

谢谢你的回复,顺便说一句,从我的第一次测试中,我得到了一个“不能从MyInterface类型对非静态方法myMethod(String,String,boolean)进行静态引用”,并且由于接口定义中不允许静态,我不知道如何继续…(没有将所有内容包装到Python类中)@user1340802:好的,请发布您的代码。我的示例不包含
myMethtod(String,String,boolean)
,因此我不知道您正在尝试执行什么操作。错误表明您可能正在尝试执行类似
MyInterface.myMethod(…)的操作
这当然不起作用。对不起,我修改了代码,现在我无法返回到以前的错误。但我在问题中添加了代码……实际上我正在尝试这种方法,但现在我得到了一个“java.lang.ClassCastException:org.python.core.PySingleton无法转换到MyInterfaceType”“来自这些:PyObject myObj=jyMyClass.\uuuu调用\uuuuuu();返回(MyInterfaceType)myObj.\uuuuu到Java(MyInterfaceType.class);我很惊讶,你从Jython那里得到的对象应该是PyFunction。你介意发布Jython代码吗?除了转换到PyTuple之外,我不知道还有什么更好的方法可以在java端取消元组的部分映射。就我个人而言,我会在python端创建第二个函数,对实际函数的返回值进行解包。
myFunction = lambda x, y : x * y
PyObject myFunction = interpreter.get("myFunction"); 
MyInterface myInterface = (MyInterface)myFunction.__tojava__(MyInterface.class);
int x = myInterface.multiply(2, 3); // Should return 6.
def tmp():
    return "some text"
public interface I{
    public String tmp();
}

public static void main(String[] args) {
    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("from test import tmp");
    PyObject tmpFunction = interpreter.get("tmp");
    System.err.println(tmpFunction.getClass());
    I i = (I) x.__tojava__(I.class);
    System.err.println(i.tmp());

}
class org.python.core.PyFunction
some text