1

jar 中的 Java 类文件可以轻松替换和修改。例如,以下命令可用于替换 jar 中已编译的类文件:

jar uf JarFile.jar com\something\Class.class

如果类文件被替换为没有依赖关系被破坏的文件,那么代码仍然能够执行。不在 jar 中的类文件也会发生同样的情况。

有什么方法可以验证一组类文件(无论是否在 jar 中)以查看它们的所有依赖项是否存在并且没有损坏?

我不想阻止类文件被修改,而是能够验证更改是否有效(关于依赖项)。编译器在编译时会进行这种检查(依赖检查),但是一旦编译了类,如何验证类文件本身呢?

4

3 回答 3

0

您可能会考虑密封签署JAR。

更新:

显然,我的第一次猜测错过了目标。

如果他们不是,你打算怎么做?如果他们是第 3 方,我会说除了向错误数据库报告下载错误之外,您别无选择。

如果您的意思是“我想确保他们所有的 3rd 方 JAR 依赖项都是正确的”,那么您遇到的问题要大得多。我知道的大多数下载(例如 Spring)都使用 Maven 提供依赖项。这是你能做的最好的。

如果您的意思是要检查自己的依赖项,我会说测试会揭示您所犯的任何错误。

于 2012-07-17T23:00:19.053 回答
-1

你不能。

至少:不是。问题是java仅在需要时才在运行时加载类。所以最终从 jar 文件中删除一个类可能没问题,只要没有执行引用该类的代码,事情就会非常顺利地运行。

考虑这个例子:

class A{ public static void main( String args[] ){ out.println( "hello" ); } }
class B{}

编译这个,把它放在一个罐子里,从中删除 B.class,那里没问题 :)

现在您可能认为您可以浏览每个 .class 文件,检查它引用的类并查看文件是否都在那里。这不仅是痛苦的,也是不完整的。您永远不会完全捕获加载了反射的文件,因为它们的类名可能只是在运行时构建的。

我的建议:不要去那里。如果有人删除了类文件,那是他们自己的错。您能做的最好的事情是(但前提是这真的让您担心)尝试ClassNotFoundException在运行时捕获 s(查看 thread.setUncaughtExceptionHandler)

于 2012-07-18T00:00:28.753 回答
-1

只需加载类就可以确保这一点。

于 2012-07-18T03:26:02.057 回答