在Java中加载已编译类并对其进行反序列化';从文件中删除实例

在Java中加载已编译类并对其进行反序列化';从文件中删除实例,java,serialization,reflection,classloader,Java,Serialization,Reflection,Classloader,我需要有一个应用程序,在运行时可以加载另一个类并成功地反序列化它的一个实例,以便它可以运行它的方法并读取成员变量 我注意到,Java中无法序列化方法,因此我考虑在project2中序列化类实例,在project1中使用ClassLoader加载编译后的类,实例化它,并将project1中的porject2中的反序列化实例分配给实例化的已加载类 序列化类将在两个项目中继承相同的父类 这是最好的方式吗?这是一个学校项目,因此要求我的应用程序可以在不更改代码的情况下接受任何其他类型的课程 TL;DR:

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

我注意到,Java中无法序列化方法,因此我考虑在
project2
中序列化类实例,在
project1
中使用
ClassLoader
加载编译后的类,实例化它,并将
project1
中的
porject2
中的反序列化实例分配给实例化的已加载类

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

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


TL;DR:我的计划是用类加载器加载一个已编译的类,这样我的项目就知道该类(特别是其中的方法),然后在项目中加载序列化的类实例,这样我就可以从实例中获取数据,并与加载的类(现在我也知道这些方法)一起获得数据,在反序列化实例上运行这些方法。

您搞错了。对某些对象调用方法的能力与序列化根本不相关

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

方法的实现仅取决于某个Java类的文件。您可以随时序列化和反序列化您的对象,但当您对此类对象调用方法时,所发生的情况仅由第一次访问相应类时相应类加载器为您加载的类文件决定

如果您的目标实际上只是“一个类将对象转储到二进制表示中”;另一段代码加载二进制数据;把它变成一个物体;访问该对象;那么你就不需要两个项目了。您也不必担心“方法存在”。只要您的类加载器知道要反序列化的对象类,一切都将正常工作。只需选择一个示例教程,像这样,并完成它

但是:您的需求是调用方法或访问任意对象的字段时;然后,您不研究序列化,而是研究Java

但这里有一个警告:反射听起来很简单,但请放心:有很多方法可以让您编写稍微错误的代码。而且,由于反射基本上是一种运行时功能,因此java编译器没有多大帮助。你写的代码看起来很合理,它编译,你运行它,你会遇到异常

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


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

您好。我的计划是用类加载器加载一个已编译的类,这样我的项目就知道该类(特别是其中的方法),然后在项目中加载序列化的类实例,这样我就可以从实例中获得数据,并与加载的类一起获得数据(现在我也知道这些方法),在反序列化实例上运行这些方法。我已经编辑了我的问题,我想说“加载另一个类并反序列化它的一个实例”,请参阅我的更新。但请理解:我们帮助解决具体问题。。。从这个意义上说,你的要求实际上太不具体了;表示感谢;-)