据我了解,JVM每个方法的编译代码限制为64KB。我有一个生成要运行的Java代码的工具,有时生成的代码包含比这更长的方法。
是否存在一种将具有过长方法的Java类文件转换为产生相同结果但可以编译的方法的自动方法?
在一个简单的例子中,代码如下:
public void longMethod
{
doSomething1();
doSomething2();
/* snip */
doSomething20000();
}
可能会转变为:
public void longMethod
{
longMethod_part1();
longMethod_part2();
/* snip */
longMethod_part10();
}
public void longMethod_part1()
{
doSomething1();
/* snip */
doSomething1000();
}
/* snip */
public void longMethod_part10()
{
doSomething9001();
/* snip */
doSomething10000();
}
然而,有一些并发症,例如long方法可能是一个非常长的if
/ else if
链。即使一般情况太难,也应该使用尽力而为的工具。
编辑:有几种善意的人建议修复生成这些长方法的工具。虽然这是一个很好的主意,但我不能利用它。对于我上面提出的一般问题,我仍然欢迎任何想法。
答案 0 :(得分:1)
例如,Eclipse中存在安全工具,但它们是供开发人员使用的。我想到了重构“Extract Method”,它具有很好的属性:
我想这不符合你的需要,你想要一些没有人为动作的东西,不是吗?
也许有些工具建立在这种能力基础之上?...
我也支持Joachim提出的修复工具的建议: - )
可以使用以下方法简化代码:
我也喜欢史蒂夫的评论。也许,如果您无法修复代码,并且无法修复该工具,则必须修复作者。
也许有可能以不同的方式使用该工具,这会使其结果不那么糟糕......
答案 1 :(得分:0)
64Kb限制是Java编译器强加的任意限制,而不是Java本身。要解决这个问题,您需要一个能够以与Java编译器相同的精度解析Java源代码的工具,估计生成的字节代码量,并将大类转换为不违反限制的类。
您需要的是Java源代码分析和转换系统。 (字节码分析器显然不起作用,因为你无法让编译器为超过64Kb的文件生成字节码。)
可以配置DMS Software Reengineering Toolkit来完成此任务。它不是一个现成的解决方案(但你的问题也不是标准的)但是准确地处理代码来实现这一点是切实可行的。但是,配置DMS来完成这项工作不是下午的工作。