缩小代码-Java

缩小代码-Java,java,optimization,obfuscation,automated-refactoring,static-analysis,Java,Optimization,Obfuscation,Automated Refactoring,Static Analysis,我想知道是否有任何工具可以优化/缩小我的Java代码。我已经发现了一些混淆器(),但我不确定这是否是我想要的,因为我实际上想要的仍然是“可读”的Java文件,但将其缩小,例如,为重复的代码创建方法,只是使代码更好 有什么工具可以做到这一点吗?有一些工具可以重新格式化代码,指出不太明显的错误,或者使用编译时代码生成来提高代码的可读性。你应该退房 不过,重新格式化代码的最好方法可能是自己动手。创建大量的单元测试,这样您就可以跟踪方法的结果,然后可以不时地以增量方式重新格式化运行测试的代码。通过这种方

我想知道是否有任何工具可以优化/缩小我的Java代码。我已经发现了一些混淆器(),但我不确定这是否是我想要的,因为我实际上想要的仍然是“可读”的Java文件,但将其缩小,例如,为重复的代码创建方法,只是使代码更好


有什么工具可以做到这一点吗?

有一些工具可以重新格式化代码,指出不太明显的错误,或者使用编译时代码生成来提高代码的可读性。你应该退房


不过,重新格式化代码的最好方法可能是自己动手。创建大量的单元测试,这样您就可以跟踪方法的结果,然后可以不时地以增量方式重新格式化运行测试的代码。通过这种方式,更改代码中的任何内容所需的工作量都要小得多-如果您的测试具有良好的质量和覆盖率,那么在重新格式化代码之后,您的代码可能会看起来完全不同(您希望的方式),并且方法的结果将保持令人满意的状态。

有一些工具可以重新格式化您的代码,指出不太明显的错误,或者使用编译时代码生成来提高代码的可读性。你应该退房


不过,重新格式化代码的最好方法可能是自己动手。创建大量的单元测试,这样您就可以跟踪方法的结果,然后可以不时地以增量方式重新格式化运行测试的代码。通过这种方式,更改代码中的任何内容所需的工作量都要小得多——如果您的测试具有良好的质量和覆盖率,那么在所有重新格式化之后,您的代码可能看起来完全不同(您希望的方式),并且方法的结果将保持令人满意。

您不是在寻求缩小,而是在寻求自动重构。这是不可能的。此外,IDE可以帮助您进行半自动重构和自动重新格式化,这也可以减少代码行数

工具可以帮助您找到需要手动修复的潜在代码问题。但是,由于他们有一些误报,仅仅自动应用他们提出的修复方案是危险的


假设测试足够全面,测试覆盖率工具也可能有助于查找未使用的代码。

您不是在寻找缩小,而是在寻找自动重构。这是不可能的。此外,IDE可以帮助您进行半自动重构和自动重新格式化,这也可以减少代码行数

工具可以帮助您找到需要手动修复的潜在代码问题。但是,由于他们有一些误报,仅仅自动应用他们提出的修复方案是危险的


假设测试足够全面,测试覆盖率工具也可能有助于查找未使用的代码。

事实上,我几天前刚刚发布了一个可以做到这一点的东西(对于编译过的java。在源代码级别,您真正能做的就是格式化技巧)。 截图:

它的工作原理: 使用ASM(字节码修改库)读取类并去除它们的调试信息。然后访问清单中给出的主类。类中引用的每个类型都会添加到列表中,并且也会被访问。该过程递归进行,直到引用的所有内容都在列表中。大多数情况下,如果您使用的是库,那么会有一些从未被引用过的类。这些不在列表中,当ASM重新编译类时,它们不包括在内


在自己运行时,它从大约700kb下降到大约150kb。大部分被删除的内容是apache commons和我自己的一些文件,这些文件没有被shrinker使用。

事实上,我几天前刚刚发布了一个可以做到这一点的东西(对于编译过的java。在源代码级别,你真正能做的就是格式化技巧)。 截图:

它的工作原理: 使用ASM(字节码修改库)读取类并去除它们的调试信息。然后访问清单中给出的主类。类中引用的每个类型都会添加到列表中,并且也会被访问。该过程递归进行,直到引用的所有内容都在列表中。大多数情况下,如果您使用的是库,那么会有一些从未被引用过的类。这些不在列表中,当ASM重新编译类时,它们不包括在内


在自己运行时,它从大约700kb下降到大约150kb。大部分被删除的是apache commons和我自己的一些文件,这些文件没有被shrinker使用。

模糊处理程序不用于优化代码。有一些反编译器可以创建类外文件的源代码。如果有人有.class文件,可以使用反编译器来创建源代码。混淆器用没有任何意义的名称替换类/变量/方法名称,如
class A
public int b()
。因此,在反编译之后,将使用“坏”名称,而不是您的愚蠢名称。这背后的唯一原因是:混淆人类,以至于使用代码非常困难——如果不是不可能的话。但它与优化无关。模糊处理程序不用于优化代码。有一些反编译器可以创建类外文件的源代码。如果有人有.class文件,可以使用反编译器来创建源代码。混淆器用没有任何意义的名称替换类/变量/方法名称,如
class A
public int b()
。因此,在反编译之后,将使用“坏”名称,而不是您的愚蠢名称。这背后的唯一原因是:混淆人类,以至于使用代码非常困难——如果不是不可能的话。但它与优化无关。你如何判断一个类在编译时是否未使用?我的程序的工作方式是读取jar的主类。然后它遍历字段类型。这些类型将添加到列表中。然后迭代这些方法。Th