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

siv*_*udh 4 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;
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

假设我已将.class文件传输到另一台主机,我是否只使用defineClass()方法构建该类?

链接在这里

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());
}
Run Code Online (Sandbox Code Playgroud)

Chs*_*y76 5

不是java.lang.Classjava类.它有自己的.class文件:-)一个实例java.lang.Class用来表示类的对象,它允许用户在其上执行某些操作(如使用反射API).

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

为什么你需要手动发送.class开头?有远程类加载器来处理这个问题.

  • 假设你的对象有`java.lang.Class`实例(例如`Class clazz = MyObject.class`),你可以通过`clazz.getResourceAsStream(clazz.getName())读取实际的.class文件. (2认同)