【问题标题】:Java: .class file and java.lang.ClassJava:.class 文件和 java.lang.Class
【发布时间】:2009-11-20 04:01:01
【问题描述】:

java.lang.Class 是否与实际的 .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 文件的对象表示吗?

更新:

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

链接here

更新 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());
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在做代码移动性。我需要在另一端使用反射来动态加载类。
    • 您需要发送实际的 .class 然后在另一端加载它。你可能想看看这个:java.sun.com/developer/technicalArticles/Networking/…
    • 假设您的对象有java.lang.Class 实例(例如Class clazz = MyObject.class),您可以通过clazz.getResourceAsStream(clazz.getName()) 读取实际的.class 文件
    • 是的,这就是你想要的。 ClassLoader 是抽象的,你需要使用 URLClassLoader 来代替。除非通过您自己的套接字(和协议?)对您至关重要,否则我实际上建议您查看 RmiClassLoader,它可以为您完成上述所有操作。
    • RMI (java.sun.com/javase/technologies/core/basic/rmi/index.jsp)。这是一个教程:java.sun.com/docs/books/tutorial/rmi/index.html 除此之外,如果你真的想将它用于类加载并且不需要实际的 RPC,你可以在一台机器上公开你的类(通过 HTTP 或任何其他支持的协议)并在另一个上使用 URLClassLoader。
    【解决方案2】:

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

    java.lang.Class 实例对“.class”文件的类型签名进行编码,但不多。因此,虽然java.lang.Class 可以被序列化,但这样做并不能为您提供足够的能力来允许在另一端实例化相应类的实例。如果你想这样做,你应该发送“.class”文件。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-01
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多