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

时间:2009-11-20 04:01:01

标签: java .class-file java.lang.class

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()方法构建该类?

链接here

UPDATE2:

此代码确实返回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 个答案:

答案 0 :(得分:5)

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

序列化根本与.class文件无关 - 它是序列化的对象状态。如果您要序列化Class<MyObject>并通过线路将其发送到没有MyObject.class的JVM,它仍然不知道MyObject是什么。

为什么你需要手动通过网络发送.class?有远程类加载器来处理这个问题。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我认为OP正在尝试在类路径中识别存在类文件的文件。见http://asolntsev.blogspot.com/2008/03/how-to-find-which-jar-file-contains.html

答案 3 :(得分:0)