Java字节码反编译 - 未使用的方法存在?

时间:2011-12-12 19:08:30

标签: java methods bytecode decompiler

说我有

private void ThisIsMySecurityMethodPleaseLookHERE() {
//security stuff
}

在我的程序中,但在任何实际执行的代码中都无法调用该方法。它被编译为字节码吗?或者Java编译器是否识别出这个事实并将其过滤掉?我知道它永远不会成为PAST字节码,因为它并没有真正被称为。

我问,因为我知道Java很容易反编译。当他们反编译我的一个.class文件时,我所有未使用的方法是否也会出现?

我认为事实并非如此,因为如果是这样的话,每个java文件都会有膨胀代码隐藏真实代码,并通过混淆器传递。

我只是想到除了混淆之外的其他方法来抵制随意的黑客。

3 个答案:

答案 0 :(得分:9)

为什么要假设?使用javap -c查看字节代码中的内容。

鉴于编译器无法知道私有方法是否可以通过反射调用,我希望它仍然存在于个人身上。

我不确定你的意思是什么:

  

我认为事实并非如此,因为如果是这样的话,每个java文件都会有膨胀代码隐藏真实代码,并通过混淆器传递。

我希望大多数开发人员都会意识到通过默默无闻的安全性几乎没有任何保护 - 而且代码本身的真正价值通常在于设计等,而不仅仅是实现。所以不,不要在你的课程中包含敏感信息 - 但同样不要太偏执。你需要权衡试图击败攻击者的成本与他们“赢”的成本。这种平衡将取决于所涉及的代码 - 以及您试图防范的攻击类型。

答案 1 :(得分:1)

私有方法实际上会使它成为字节代码。也许甚至汇编代码。你必须想到所有这些方法都被转化为例程。因此,对于任何未使用的私有方法,字节代码块中仍然会有例程。

另一方面,有些工具可以清理这些东西,并删除过多的未使用的代码/类。如果是这种情况那么,是的,你没有在反编译代码中。

答案 2 :(得分:0)

测试并发现您需要添加选项-p(又名-private)以获取私有方法的内容。