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

时间:2017-02-28 07:50:55

标签: java serialization reflection classloader

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

从我注意到,你无法在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的已编译类,实例化它并将project1porject2的反序列化实例分配给实例化的加载类。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

方法 实现取决于某些Java类的文件。您可以根据需要频繁地序列化和反序列化您的对象 - 但是当您在这样的对象上调用方法时,会发生的情况是由类文件确定的对应的类加载器为您加载时< em> first 访问相应的类。

如果您的目标实际上只是“一个类将对象转储为二进制表示”;另一段代码加载二进制数据;把它变成一个物体;访问该对象;然后你做需要两个项目。你也不必担心那里的“方法”。只要你的ClassLoader 知道要反序列化的对象类,一切都会正常工作。只需选择一个示例教程,例如here,然后完成它。

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

但是有一句警告:反射听起来很容易,但请放心:有很多方法可以编写稍微错误的代码。因为反射基本上是一个运行时的东西,所以java编译器没有多大帮助。你编写看起来合理的代码,编译代码,运行代码,然后抛出异常。

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

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