2009-11-20 50 views
4

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

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

(如果您想了解更多信息读取)

假设我有一个名为someObj中的Java类。编译这个文件时,会生成一个名为SomeObj.class的文件。

我们也知道,如果我有someObj中作为一种类型,我们可以通过做得到它的java.lang.Class类型:

Class someObjClss = SomeObj.class; 

我们知道java.lang.Class中实现Serializable,因此可以传输。

那么java.lang.Class基本上是实际.class文件的对象表示形式吗?

UPDATE:

假设我已经传送的.class文件到另一台主机,我只是使用的defineClass()方法构造类的回来?

链接here

UPDATE2:

此代码返回空的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()); 
} 

回答

5

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

序列化与.class文件完全没有关系 - 它是对象状态被序列化。如果您想序列化Class<MyObject>并通过线路将它发送给没有MyObject.class的JVM,它仍然不知道MyObject是什么。

为什么你需要手动通过电线发送.class开始?有远程类装载机来处理这个问题。

+0

我在做代码移动。我需要在另一端使用Reflection来动态加载类。 – sivabudh 2009-11-20 04:07:22

+1

您需要发送实际的.class然后在另一端加载它。你可能想看看这篇文章:http://java.sun.com/developer/technicalArticles/Networking/classloaders/ – ChssPly76 2009-11-20 04:10:56

+0

感谢您的文章。我其实只需要加载.class文件。有没有简单的方法来从我的应用程序中简单地找到.class文件? – sivabudh 2009-11-20 04:17:15

2

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

java.lang.Class实例对“.class”文件的类型签名进行编码,但不是更多。因此,尽管可以序列化一个java.lang.Class,但这样做并不足以让您在另一端实例化相应类的实例。如果你想这样做,你应该发送“.class”文件。