gpt4 book ai didi

java - my_class.class 属性的 Py4J 问题。它是什么?

转载 作者:行者123 更新时间:2023-11-30 11:21:05 25 4
gpt4 key购买 nike

我正在尝试使用 Py4J 从 Python 访问 Java DAO 方法,我遇到了一个奇怪的问题。我有以下 MyApplication.java 文件。我可以正确编译,它似乎可以使用 Py4J 从 Python 中进行工作:

import py4j.GatewayServer;

import company.common.dao.DAOFactory;
import company.sys.dao.ABCartDAO;

public class MyApplication {

public String foo (int n) {
ShoppingCart bar = DAOFactory.getDAO(ABCartDAO.class);
String identifier bar.findit(n)
return identifier;
}

public static void main(String[] args) {
MyApplication app = new MyApplication();
GatewayServer server = new GatewayServer(app);
server.start();
}
}

我可以用 java MyApplication 启动服务器。但是,当我在 Python 中运行以下命令时:

from py4j.java_gateway import JavaGateway
gateway = JavaGateway() # connect to the JVM

# Testing that it works
random = gateway.jvm.java.util.Random() # create a java.util.Random instance
number1 = random.nextInt(10) # call the Random.nextInt method
number2 = random.nextInt(10)
print(number1,number2)

my_application = gateway.entry_point

my_application.foo(4)

获取随机数是有效的(证明 Py4J 正在做它的工作),但是对操作的调用失败了:

---------------------------------------------------------------------------
Py4JJavaError Traceback (most recent call last)
<ipython-input-14-d2345f6205bf> in <module>()
----> 1 my_application.foo(4)

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/py4j/java_gateway.pyc in __call__(self, *args)
535 answer = self.gateway_client.send_command(command)
536 return_value = get_return_value(answer, self.gateway_client,
--> 537 self.target_id, self.name)
538
539 for temp_arg in temp_args:

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/py4j/protocol.pyc in get_return_value(answer, gateway_client, target_id, name)
298 raise Py4JJavaError(
299 'An error occurred while calling {0}{1}{2}.\n'.
--> 300 format(target_id, '.', name), value)
301 else:
302 raise Py4JError(

Py4JJavaError: An error occurred while calling t.foo.
: java.lang.NoClassDefFoundError: company/sys/dao/ABCartDAO
at MyApplication.foo(MyApplication.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
at py4j.Gateway.invoke(Gateway.java:259)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Thread.java:744)

为什么?

以防万一,我在 pom.xml

中使用以下内容构建我的 java 文件
  <dependency>
<groupId>net.sf.py4j</groupId>
<artifactId>py4j</artifactId>
<type>jar</type>
<version>0.8.1</version>
</dependency>

我是否应该在编译我的 .class 文件时包含一些额外的依赖项?这是 Py4J 的错误吗?也许是不受支持的功能?

最佳答案

您在这里有很多不相关的问题。回答第一个:

Say I define a class called MyClass What does MyClass.class hold? is it a string? (if so, what would it be for MyClass?) Something else?

它包含对 Class 的引用对象,您可以将其用于各种用途,最值得注意的是获取有关类的运行时信息以进行调试和反射。非静态方法返回的也是一样的东西getClass() :

Class<?> clz = MyClass.class;
Class<?> clz = new MyClass().getClass();

我对 Py4J 并不完全熟悉,但您可以使用后者来访问给定对象实例的 Class。请注意,getClass()java.lang.Object 的基本方法。

关于java - my_class.class 属性的 Py4J 问题。它是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com