gpt4 book ai didi

java - 从 .class 文件创建实例时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:33 24 4
gpt4 key购买 nike

我正在开发一个客户端服务器应用程序,其中我将一个 .class 文件从一个 jvm 复制到另一个 jvm。我需要使用反射在第二台机器(该机器不包含其 .java 文件)中使用此 .class 文件创建一个实例,但我收到以下错误。此外,我的项目由各种包组成 - 一个用于服务器,另一个用于客户端。在使用反射时,我尝试仅提供类名称(复制的类),这让我想知道这是否是一个问题。类路径是否存在问题或未提供完全限定的类名或其他问题?

java  Server/remoteServer
Exception in thread "main" java.lang.NoClassDefFoundError: Server/Registry_stub (wrong name: registry/Registry_stub)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at generics.Naming.bind(Naming.java:34)
at Server.remoteServer.main(remoteServer.java:17)

这是我遇到问题的方法:

    public static void bind(String name, myRemoteInterface obj) throws AlreadyBoundException, RemoteException, IOException {

RegistryInterface stub = null;
try{

stub = (RegistryInterface)Class.forName("Server.Registry_stub").newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
e.printStackTrace();
}
stub.bind(name, obj);

}

Registry_stub 在不同的机器上编译,.class 文件被复制到调用绑定(bind)函数的客户端机器(在名为 Server 的包中)。我的目标是调用Registry_stub 类中定义的bind 方法,我在客户端中拥有该类的.class。

感谢您的帮助

最佳答案

由于您没有发布任何代码,我不确定这是否确实是您的问题,但它就是这样。

<小时/>

关于包的信息也写在类文件中。我的这一假设基于这样一个事实:存在返回 package 的反射方法 getPackage()。示例

System.out.println(String.class.getPackage().getName());

将打印java.laang

为了能够加载发送类,您必须使用其完整的包名称,换句话说 Class.forName("foo.bar.YourClass") 并且类 ClassLoader 将尝试在表示包的目录中搜索 YourClass.class 文件,因此该结构必须放置在内部([...] 表示目录)

[foo]
|
+-[bar]
|
+-YourClass.class

结构(foo目录必须放置在类路径中指定的目录内)。

因此,在您的项目中为此类包结构创建一些目录并将其添加到您的类路径中。另外,不要忘记不仅发送文件名,还要发送完整的包名称。

关于java - 从 .class 文件创建实例时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24229106/

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