I've recently discovered py4j and was able to call static java methods from python. Now I want to call python methods from java. I couldn't find much documentation so this is the last place I can think of that might tell me if it's possible, and how.
You can call a Python method from Java by implementing a Java interface on the python side.
The steps are:
gateway = JavaGateway(start_callback_server=True)
Example adapted from the Py4J documentation:
Java code:
// File 1
package py4j.examples;
public interface Operator {
        public int doOperation(int i, int j);
        public int doOperation(int i, int j, int k);
}
// File 2
package py4j.examples;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import py4j.GatewayServer;
public class OperatorExample {
    // To prevent integer overflow
    private final static int MAX = 1000;
    public List<Integer> randomBinaryOperator(Operator op) {
        Random random = new Random();
        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(random.nextInt(MAX));
        numbers.add(random.nextInt(MAX));
        numbers.add(op.doOperation(numbers.get(0), numbers.get(1)));
        return numbers;
    }
}
Python code:
from py4j.java_gateway import JavaGateway
class Addition(object):
    def doOperation(self, i, j, k = None):
        if k == None:
            return i + j
        else:
            return i + j + k
    class Java:
        implements = ['py4j.examples.Operator']
if __name__ == '__main__':
    gateway = JavaGateway(start_callback_server=True)
    operator = Addition()
    operator_example = gateway.jvm.py4j.examples.OperatorExample()
    # "Sends" python object to the Java side.
    numbers = operator_example.randomBinaryOperator(operator) 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With