Java:.class文件和Java.lang.class
java.lang.Class是否与实际的.Class文件相同?i、 内容是否等效 我想通过套接字发送.class,我想知道我是否可以只传输java.lang.class,而不是尝试查找和加载实际的.class文件 精化(如需更多信息,请阅读) 假设我有一个名为SomeObj的Java类。编译此文件时,将生成名为SomeObj.class的文件 我们还知道,如果我将SomeObj作为一个类型,我们可以通过以下操作获得它的java.lang.Class类型:Java:.class文件和Java.lang.class,java,.class-file,java.lang.class,Java,.class File,Java.lang.class,java.lang.Class是否与实际的.Class文件相同?i、 内容是否等效 我想通过套接字发送.class,我想知道我是否可以只传输java.lang.class,而不是尝试查找和加载实际的.class文件 精化(如需更多信息,请阅读) 假设我有一个名为SomeObj的Java类。编译此文件时,将生成名为SomeObj.class的文件 我们还知道,如果我将SomeObj作为一个类型,我们可以通过以下操作获得它的java.lang.Class类型: Class someObjClss =
Class someObjClss = SomeObj.class;
我们知道java.lang.Class实现了可序列化,因此它可以被传输
那么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());
}
否。
java.lang.Class
是一个java类。它有自己的.class文件:-)一个java.lang.class
的实例用于表示对象的类,允许您对其执行某些操作(例如使用反射API)
序列化与.class文件没有任何关系-序列化的对象状态是对象状态。如果要序列化类
并通过网络将其发送到没有MyObject.Class的JVM,它仍然不知道MyObject是什么
为什么您需要手动首先通过网络发送.class?有一些远程类加载器可以处理这个问题。请看。一个
java.lang.class
实例与相应的“.class”文件相关,但它们决不是等价的
java.lang.Class
实例对“.Class”文件的类型签名进行编码,但仅此而已。因此,尽管可以序列化java.lang.Class
,但这样做并不能为您提供足够的资源来允许在另一端实例化相应类的实例。如果您想这样做,您应该发送“.class”文件。我认为OP正在试图识别类文件所在的类路径上的一个文件。请参见我正在进行代码迁移。我需要在另一端使用反射来动态加载该类。您需要发送实际的.class,然后在另一端加载它。您可能需要仔细查看:假设您的对象有java.lang.Class
实例(例如Class clazz=MyObject.Class
),您可以通过clazz.getResourceAsStream(clazz.getName())读取实际的.Class文件。
是的,这就是您想要的。类加载器是抽象的,您需要改用URLClassLoader。除非通过您自己的套接字(和协议?)执行此操作对您来说至关重要,否则我实际上建议您查看能够为您完成上述所有操作的RmiClassLoader.RMI()。这里有一个教程:除此之外,如果您真的只想将其用于类加载,而不需要实际的RPC,您可以在一台机器上公开您的类(通过HTTP或任何其他受支持的协议),并在另一台机器上使用URLClassLoader。