是否有一种使用超长(> 64kb编译)方法转换Java代码的自动方法?

时间:2009-09-30 14:56:44

标签: java code-generation

据我了解,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链。即使一般情况太难,也应该使用尽力而为的工具。

编辑:有几种善意的人建议修复生成这些长方法的工具。虽然这是一个很好的主意,但我不能利用它。对于我上面提出的一般问题,我仍然欢迎任何想法。

2 个答案:

答案 0 :(得分:1)

例如,Eclipse中存在安全工具,但它们是供开发人员使用的。我想到了重构“Extract Method”,它具有很好的属性:

  • 自动修复调用代码
  • 保证是正确的

我想这不符合你的需要,你想要一些没有人为动作的东西,不是吗?

也许有些工具建立在这种能力基础之上?...


我也支持Joachim提出的修复工具的建议: - )

可以使用以下方法简化代码:

  • 用于常见的通话序列,定义它们(甚至手动),让工具识别它们;它会简单地称呼它们,结果会更短。
  • 更改数据序列的代码序列:不是组合方法调用,而是拥有读取数据的代码循环,并为每个数据执行正确的作业。关键是数据可以来自任何结构(文件,流,数据库),它不一定是代码。

我也喜欢史蒂夫的评论。也许,如果您无法修复代码,并且无法修复该工具,则必须修复作者

也许有可能以不同的方式使用该工具,这会使其结果不那么糟糕......

答案 1 :(得分:0)

显然,如果有人可以选择,修改生成工具以分开大班是最简单的选择。如果无法做到这一点,你需要另一个答案。

64Kb限制是Java编译器强加的任意限制,而不是Java本身。要解决这个问题,您需要一个能够以与Java编译器相同的精度解析Java源代码的工具,估计生成的字节代码量,并将大类转换为不违反限制的类。

您需要的是Java源代码分析和转换系统。 (字节码分析器显然不起作用,因为你无法让编译器为超过64Kb的文件生成字节码。)

可以配置DMS Software Reengineering Toolkit来完成此任务。它不是一个现成的解决方案(但你的问题也不是标准的)但是准确地处理代码来实现这一点是切实可行的。但是,配置DMS来完成这项工作不是下午的工作。