- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个应用程序,在运行时可以加载另一个类并成功反序列化其中一个实例,以便它可以运行它的方法并读取成员变量。
据我所知,Java 中无法序列化方法,因此我正在考虑在 project2
中序列化类实例,并使用 ClassLoader
加载已编译的类project1
,实例化它,并将project1
中porject2
的反序列化实例分配给实例化的加载类。
序列化的类将在两个项目中继承相同的父类。
这是最好的方法吗?这是一个学校项目,因此要求我的应用程序可以接受任何其他类型的类(class),而无需更改代码。
TL;DR:我的计划是使用 ClassLoader 加载已编译的类,以便我的项目了解该类(特别是其中的方法),然后在项目中加载该序列化的类实例,以便我可以从中获取数据实例并与加载的类(现在我也知道这些方法)一起在反序列化的实例上运行这些方法。
最佳答案
你错了。在某些对象上调用方法的能力与序列化完全无关。
我的意思是:方法实现不是序列化数据的一部分! Java 序列化仅将字段数据写入该输出流。
方法的实现仅依赖于某些Java类的class文件。您可以根据需要多次序列化和反序列化对象,但是当您在此类对象上调用方法时发生的情况仅由相应类加载器在以下情况下为您加载的类文件决定: em>首先访问相应的类。
如果您的目标实际上只是“一个类将对象转储为二进制表示形式”;另一段代码加载该二进制数据;把它变成一个物体;访问该对象;那么您不需要需要两个项目。您也不必担心那里的“方法”。只要您的类加载器知道要反序列化的对象类,一切都会正常进行。只需选择一个示例教程,例如 here并解决它。
但是:当您的要求是调用任意对象的方法或访问字段时;那么你就不会研究序列化,而是研究Java reflection 。
但是有一点警告:反射听起来很简单,但请放心:有很多方法可以让您编写稍微错误的代码。而且因为反射基本上是一个运行时的东西,所以java编译器没有多大帮助。你编写看起来合理的代码,它会编译,你会运行它,然后你就会收到异常。
从这个意义上说,反射(reflection)是 Java 类(class)中的一个高级主题;我认为你应该退后一步,向你的老师澄清他们对你的具体期望。
鉴于您的最新更新:然后只需查看有关序列化的教程(并忘记反射部分)。回答你的问题:是的,这听起来是一个可行的方法。不能说更多;因为到目前为止您还没有共享代码。
关于java - 在 Java 中加载已编译的类并从文件反序列化它的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503022/
我是一名优秀的程序员,十分优秀!