我需要一个应用程序,在运行时可以加载另一个类并成功地反序列化其中一个实例,以便它可以运行它的方法并读取成员变量。
从我注意到,你无法在Java中序列化方法,所以我正在考虑在attribute_id value count
188 48 2
188 43 3
188 51 1
188 94 1
188 22 2
190 33 1
190 11 1
190 90 2
190 61 2
中序列化类实例,在project2
中加载ClassLoader
的已编译类,实例化它并将project1
中porject2
的反序列化实例分配给实例化的加载类。
序列化类将在两个项目中继承相同的父类。
这是最好的方式吗?这是一个学校项目,所以要求是我的应用程序可以接受任何其他类型的类而不更改代码。
TL; DR:我的计划是使用ClassLoader加载一个已编译的类,以便我的项目知道该类(特别是里面的方法),然后在项目中加载该序列化的类实例,以便我可以从中获取数据实例和加载的类(现在我也知道方法),在反序列化的实例上运行方法。
答案 0 :(得分:2)
你错了。在某个对象上调用方法的能力与序列化完全无关。
我的意思是:方法实现不是序列化数据的一部分! Java序列化仅将字段数据写入该输出流。
方法 的实现取决于某些Java类的类文件。您可以根据需要频繁地序列化和反序列化您的对象 - 但是当您在这样的对象上调用方法时,会发生的情况是仅由类文件确定的对应的类加载器为您加载时< em> first 访问相应的类。
如果您的目标实际上只是“一个类将对象转储为二进制表示”;另一段代码加载二进制数据;把它变成一个物体;访问该对象;然后你做不需要两个项目。你也不必担心那里的“方法”。只要你的ClassLoader 知道要反序列化的对象类,一切都会正常工作。只需选择一个示例教程,例如here,然后完成它。
但是:当您的要求是调用任意对象的方法或访问字段时;那么你不会考虑序列化,而是考虑Java reflection。
但是有一句警告:反射听起来很容易,但请放心:有很多方法可以编写稍微错误的代码。因为反射基本上是一个运行时的东西,所以java编译器没有多大帮助。你编写看起来合理的代码,编译代码,运行代码,然后抛出异常。
从这个意义上讲,反思是Java课程中的高级主题;而且我认为你应该退一步向老师澄清他们对你的期望。
鉴于您的最新更新:然后只需查看有关序列化的教程(并忘记反射部分)。并回答你的问题:是的,这听起来像一个可行的方法。不能多说;因为到目前为止你还没有共享代码。