Java:.class 文件和 java.lang.Class

4

java.lang.Class是否与实际的.class文件相同?即内容是否等价?

我想通过套接字发送.class文件,并想知道是否可以只传输java.lang.Class,而不是尝试查找和加载实际的.class文件?

详细说明(如果您需要更多信息,请阅读)

假设我有一个名为SomeObj的Java类。当编译此文件时,将生成一个名为SomeObj.class的文件。

我们也知道,如果我有SomeObj作为类型,我们可以通过执行以下操作获取其java.lang.Class类型:

Class someObjClss = SomeObj.class;

我们知道java.lang.Class实现了Serializable接口,因此它可以被传输。
那么java.lang.Class基本上是实际.class文件的对象表示吗?
更新:
假设我已经将.class文件传输到另一个主机,我是否只需使用defineClass()方法来构建类?
链接 这里 更新2:
这段代码确实返回null InputStream。这怎么可能?
Class clazz = String.class;

String className = clazz.getName(); System.out.println(className);
URL url = clazz.getResource(className);
if( url != null )
{
  String pathName = url.getPath(); System.out.println(className);
}

InputStream inputStream = clazz.getResourceAsStream(className);
if(inputStream != null )
{
  System.out.println(inputStream.available());
}
4个回答

5

第一句话中的java.lang.Class是java类,它有自己的.class文件 :-) java.lang.Class的一个实例用于表示对象的类,允许您对其执行某些操作(例如使用反射API)。

序列化与.class文件完全无关——序列化的是对象状态。如果您将Class<MyObject>进行序列化并将其发送到一个没有MyObject.class的JVM上,它仍然不知道MyObject是什么。

为什么需要手动将.class文件通过网络发送呢?有远程类加载器可以处理这个问题。


1
你需要发送实际的 .class 文件,然后在另一端加载它。你可能想浏览一下这个链接:http://java.sun.com/developer/technicalArticles/Networking/classloaders/ - ChssPly76
2
假设您拥有对象的java.lang.Class实例(例如Class clazz = MyObject.class),则可以通过clazz.getResourceAsStream(clazz.getName())读取实际的.class文件。 - ChssPly76
1
是的,那就是你想要的。ClassLoader 是抽象的,你需要使用 URLClassLoader。除非通过自己的套接字(和协议?)来做这件事对你非常重要,我实际上建议你看一下 RmiClassLoader,它会为你完成以上所有工作。 - ChssPly76
如果我在局域网上运行应用程序呢?也就是说,只有两台计算机,一台保存动态类,另一台请求该类。是否有一些API可以像服务器/客户端那样连接(即指定主机名/IP地址和端口号)? - sivabudh
1
RMI(http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp)。这里有一个教程:http://java.sun.com/docs/books/tutorial/rmi/index.html此外,如果您真的只想将其用于类加载而不需要实际的RPC,则可以在一台机器上公开您的类(通过HTTP或任何其他支持的协议),并在另一台机器上使用URLClassLoader。 - ChssPly76
显示剩余7条评论

2

java.lang.Class实例与相应的“.class”文件有关,但它们绝不等同。

java.lang.Class实例对“.class”文件的类型签名进行编码,但没有太多其他信息。因此,尽管java.lang.Class可以被序列化,但这样做并不能为您提供足够的信息,以允许在另一端实例化相应类的实例。如果您想要这样做,应该发送“.class”文件。


1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接