2016-11-03 16 views
2

私はpythonからJavaコードにvarargsを渡そうとしています。Py4jを使ってPythonからJavaにvarargsを渡す

のJavaコード: LogDebugCmd.java

public class LogDebugCmd implements Command { 
    private Class clazz; 
    private String format; 
    private Object[] args; 

    public LogDebugCmd() {} 
    public void setLog(String format, Object... args) { 
    this.format = format; 
    this.args = args.clone(); 
    clazz = getClass(); 
    } 

    @Override 
    public void execute() { 
    VLog.getLog(clazz).debug(format, args); 
    } 

CommandEntryPoint.java

public class CommandEntryPoint { 
    private LogDebugCmd logDebugCmd; 

    public CommandEntryPoint() { 
    logDebugCmd = new LogDebugCmd(); 

    public LogDebugCmd getLogDebugCmd(String str, Object... args) { 
    setLog(str, args); 
    return logDebugCmd; 
    } 
    public static void main(String args[]) { 
    GatewayServer gatewayServer = new GatewayServer(new CommandEntryPoint()); 
    gatewayServer.start(); 
    System.out.println("Gateway Server Started"); 
    } 

Pythonコード test.py:

from py4j.java_gateway import JavaGateway 
gateway = JavaGateway() 
logDebugCmd = gateway.entry_point.getLogDebugCmd("Step 01 - Test initiated.") 
logDebugCmd..execute() 

エラー:

Traceback (most recent call last): 
    File "C:/Python27/Lib/site-packages/py4j-0.10.3-py2.7.egg/py4j/sampleTLStest.py", line 4, in <module> 
    logDebugCmd = gateway.entry_point.getLogDebugCmd("Step 01 - Test initiated.") 
    File "C:\Python27\lib\site-packages\py4j-0.10.3-py2.7.egg\py4j\java_gateway.py", line 1133, in __call__ 
    answer, self.gateway_client, self.target_id, self.name) 
    File "C:\Python27\lib\site-packages\py4j-0.10.3-py2.7.egg\py4j\protocol.py", line 323, in get_return_value 
    format(target_id, ".", name, value)) 
***Py4JError: An error occurred while calling t.getLogDebugCmd. 
Trace: 
py4j.Py4JException: Method getLogDebugCmd([class java.lang.String]) does not exist at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318) 
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326) 
at py4j.Gateway.invoke(Gateway.java:272) 
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 
at py4j.commands.CallCommand.execute(CallCommand.java:79) 
at py4j.GatewayConnection.run(GatewayConnection.java:214) 
at java.lang.Thread.run(Thread.java:745)*** 

Javaにvarargsを渡す方法はありますか? getLogDebugCmd()の2番目の引数としてStringを渡そうとしていますが、これもエラーです。あなたがこれを行うことができますので

答えて

0

可変引数が実際に配列として表現されています

# Pass a None if you have no varargs 
logDebugCmd = gateway.entry_point.getLogDebugCmd("Step 01 - Test initiated.", None) 

# Create an array of objects 
object_class = gateway.jvm.Object 
object_array = gateway.new_array(object_class, 2) 
object_array[0] = "foo" 
object_array[1] = "bar" 
logDebugCmd = gateway.entry_point.getLogDebugCmd("Step 01 - Test initiated.", object_array) 

Py4Jで可変引数のサポートを改善するためのpull requestがありますが、それはまだマージされていないので、それはいくつかのコンパイルの問題があります。

+0

@ Barthelemy、すばやく返信いただきありがとうございます。これは助けになりました。 – Pooja

+0

Object ... argsの代わりに渡す前に、 'None' - > Cast Noneを 'Object'型に渡すだけで1つの修正ができます。 Javaでは、Object配列の代わりにnullではなくNullオブジェクトを渡していることを明確にする方法として、後でNullPointerExceptionが発生します。参照:[リンク](http://stackoverflow.com/questions/4028059/calling-java-varargs-method-with-single-null-argument)。例えば : 'object_array [0] =なし logDebugCmd = gateway.entry_point.getLogDebugCmd( "ステップ01 - テスト開始"、object_array)は' – Pooja

+0

実際には、呼び出したコードに依存する:それは引数であるかどうかをチェックする場合nullの場合、NullPointerExceptionは発生しません。これを考えれば、空の配列を作成するほうがよいでしょう。object_array = gateway.new_array(object_class、0)。 – Barthelemy

関連する問題