2

我的程序具有以下结构:

void main (String[] args) {
   Object largeObject = longInitialization();
   interestingLogic(largeObject);
}

longInitialization 代码在开发过程中永远不会改变。但是,每当我更改了有趣的逻辑时,我都必须再次运行程序并等待 longInitialization 完成。

不幸的是,我无法序列化 largeObject,因为它不可序列化并且我没有代码。

有什么技巧可以节省初始化时间吗?也许,在初始化之后以某种方式保存 JVM 的状态,然后总是从那个状态开始?

4

5 回答 5

2

您可以对代码进行少量修改:

main(){
    Object largeObject = longInitialization();
    boolean debug = true;
    while(debug){
        interestingLogic(largeObject);
    }
}

现在以调试模式运行程序。在调用时设置断点interestingLogic并在 IDE 中使用代码热插拔调试模式。在 Ecipe 中阅读有关热插拔的更多信息:Java Hotswap with Eclipses and Remote Debugging on Local Machine

//编辑:

另一种选择。只写模拟largeObject.

于 2013-03-06T14:54:40.790 回答
1

您将需要一个新对象来调用interestingLogic(largeObject)。您可以在驱动程序等待用户输入时更改新对象。

void main (String[] args) {
Object largeObject = longInitialization();

 boolean anotherTry = true;
 String answer = "";
 Scanner input = new Scanner(System.in);
 while (anotherTry) {
        Object newobject = NewObject();
        newobject.interestingLogic(largeObject).
        System.out.print("Run Again Y/N");
        answer = input.nextLine();
        if (answer.equalsIgnoreCase("N")) {
            anotherTry = false;
        }

    }
}
于 2013-03-06T15:04:38.520 回答
0

如果不立即需要大对象,您可以使用“延迟初始化”包装器来装饰它,并在您想要访问它之前调用“longInitialization”。

第二种解决方案可能是通过将其编组/解组到 xml 文件来“克隆”它

于 2013-03-06T14:57:46.703 回答
0

因为您说“...无法序列化 largeObject...”,所以无法在 JVM 生命周期内持久保存对象(因为您没有源代码)。但是,您有初始化/使用 largeOject 的代码。创建一个可序列化的 debugLargeObject,其行为类似于真正的 largeObject,并在开发过程中使用 debugLargeObject。

于 2013-03-06T15:05:42.203 回答
0

不是没有很多工作。您需要一个小的重构,如 Guido 所示,然后您需要每次通过循环(或其他)重新加载 NewObject 类。换句话说,您的 VM 需要能够在每次更改代码时删除 NewObject 类,然后重新加载它。

有一些商业产品可以做到这一点(例如,参见 JRebel)。您可以自己滚动(请参阅此 StackOverflow 主题:Unloading classes in java?)。如果您对有趣的逻辑非常小心,您可以进行热插拔。但最终,你需要以某种方式换掉那个类。

于 2013-03-07T22:07:30.957 回答