java - 当我更改类时,实例会发生什么?

时间:2017-10-02 09:39:19

标签: java memory memory-management dynamic memory-model

我将被要求提出一个"自适应"类布局,即在我的例子中,可以将某些数组元素作为它们自己的字段内联或在运行时更改它们的大小。

我不知道该怎么做(还有?),但是让我们假设片刻,我有。

当我更改所述类的字节码时,class A的实例会发生什么变化?

特别是,如何处理场/方法偏移?

例如,让我们说我在课程中添加一个字段...会影响创建的实例还是只是新创建的实例?

编辑:由于人们要求提供详细信息,我的任务是

  

"在运行时对类别布局修改的先前工作进行调查,并根据调查中获得的知识,为[技术细节]实施此类布局修改"

如果您对这些"技术细节"感兴趣,我将致力于

Synchronized-by-Default框架,它使用 - atm - 一个固定大小的锁数组,每个锁由一个数值组成,其最后N个字节用作事务ID。

由于使用锁数组会减少数据局部性,我们感兴趣的是确定一种启发式方法,告诉我们什么时候内联锁是有意义的 - 也就是说锁和它们对应的对象(希望)最终会相同的缓存行。

此外,使用固定大小的ID会人为地限制在任何一个时间点可以同时处于活动状态的事务量。所以我们希望能够“成长”#34;他们随需应变。

我应该想出一个动态类布局,它将支持两种内联锁,并根据需要增长它们。

2 个答案:

答案 0 :(得分:1)

这是不可能的。至少没有非常恶劣的魔力。如果您决定应用其中的一部分会发生什么事情取决于您,

修改

很难证明某些事情没有,但我试着提出一些论点:

  • 语言规范和公共API中没有此类选项。
  • 我所知道的任何实现都不支持该功能。
  • 在运行时更改类型定义是违反静态类型的想法。

答案 1 :(得分:0)

您正在寻找一些字节码修改框架,例如:

http://asm.ow2.org/

所有类型的框架都使用其中一些来构建,例如代理对象。也许这是一个不好的例子,因为它正在构建一个可分配的新的富集类。但正如已经提到的,你真的需要知道你在做什么。

至少 asm 为您提供验证器,以获取最终引入问题的某种提示。不知道其他框架如何处理这个问题。

再说一遍警告! 最好尝试改进您的应用程序架构或尝试类似Apaches DynaBean(https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/DynaBean.html)。