我的程序具有以下结构:
void main (String[] args) {
Object largeObject = longInitialization();
interestingLogic(largeObject);
}
longInitialization代码在开发期间永远不会更改。每当我更改有趣的逻辑时,我都必须再次运行程序并等待longInitialization完成。
不幸的是我无法序列化largeObject,因为它不是Serializable,我没有代码。
有没有可以节省初始化时间的技巧?也许,以某种方式在初始化之后保存JVM的状态,然后总是从该状态开始?
答案 0 :(得分:2)
您可以对代码进行少量修改:
main(){
Object largeObject = longInitialization();
boolean debug = true;
while(debug){
interestingLogic(largeObject);
}
}
现在以调试模式运行程序。在interestingLogic
调用时设置断点并在IDE中使用代码热插拔调试模式。阅读更多关于Eclipe中的hotswap:Java Hotswap with Eclipses and Remote Debugging on Local Machine
//编辑:
还有一个选择。只需写一下largeObject
的模拟。
答案 1 :(得分: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;
}
}
}
答案 2 :(得分:0)
如果不需要立即使用大对象,可以使用“延迟初始化”包装器来装饰它,并在您想要访问它之前调用“longInitialization”。
第二种解决方案可以通过将其编组/解组到xml文件来“克隆”它
答案 3 :(得分:0)
因为您说“...无法序列化largeObject ...”,所以无法在JVM生命周期内持久保存对象(因为您没有源代码)。但是,您有初始化/使用largeOject的代码。创建一个可序列化的debugLargeObject,其作用类似于真正的largeObject,并在开发期间使用debugLargeObject。
答案 4 :(得分:0)
不是没有很多工作。你需要一个次要的重构,如Guido所示,然后你需要每次通过循环(或其他)重新加载NewObject类。换句话说,每次更改代码时,您的VM都需要能够删除NewObject类,然后重新加载它。
有商业产品可以做到这一点(例如,参见JRebel)。您可以自己滚动(请参阅此StackOverflow主题:Unloading classes in java?)。如果你对你的有趣的逻辑非常小心,你可以热切换。但最终,你需要以某种方式换掉那个班级。