在 Java 中加载已编译的 class 并从文件反序列化它的实例

Loading a compiled class in Java and deserializing it's instance from a file

我需要一个应用程序,在 运行 时间内可以加载另一个 class 并成功反序列化其中一个实例,以便它可以 运行 它的方法并读取成员变量。

根据我的观察,您不能序列化 Java 中的方法,所以我正在考虑序列化 project2 中的 class 实例,加载已编译的 class with ClassLoader in project1,实例化它并将porject2 in project1中的反序列化实例分配给实例化加载的class.

序列化的 class 将在两个项目中继承相同的父 class。

这是最好的方法吗?这是一个学校项目,所以要求我的应用程序可以在不更改代码的情况下接受任何其他类型的 class。

TL;DR:我的计划是用 ClassLoader 加载一个已编译的 class,这样我的项目就知道 class(特别是里面的方法),然后加载那个序列化的 class项目中的实例,以便我可以从实例中获取数据以及加载的class(现在我也知道这些方法),运行反序列化实例上的方法。

你错了。在某些对象上调用方法的能力与序列化 完全无关

我的意思是:方法实现是不是序列化数据的一部分! Java 序列化仅将 field 数据写入该输出流。

一个方法的实现依赖于class文件一些 Java class。您可以随心所欲地序列化和反序列化您的对象 - 但是当您在此类对象上调用方法时会发生什么 only 由 class 文件确定相应的class加载程序在第一次访问相应的class时为您加载。

如果你的目标真的只是"one class dumps an object into a binary representation";另一段代码加载该二进制数据;把它变成一个对象;访问该对象;那么您不需要需要两个项目。您也不必担心 "the methods being" 那里。只要您的 ClassLoader 知道 要反序列化的 class 个对象,一切都会正常进行。只需选择一个示例教程,例如 here 并完成它。

但是:你的要求是调用任意对象的方法或访问字段;那么您不研究序列化,而是研究 Java reflection

但这里有一个警告:反射听起来很容易,但请放心:有很多方法可以让您编写略有错误的代码。因为反射基本上是 运行time 的东西,所以 java 编译器帮不上什么忙。您编写看起来合理的代码,它编译,您 运行 它,然后您会抛出异常。

从这个意义上讲,反思是 Java 课程中的一个 高级 主题;我认为你应该退后一步,向你的老师澄清他们对你的期望。

鉴于您的最新更新:然后只需查看有关序列化的教程(忘记反射部分)。并回答您的问题:是的,这听起来像是一种可行的方法。不能多说;因为到目前为止您还没有共享代码。