我想禁用抛出异常时生成的堆栈跟踪。
我用过了,
Runtime.getRuntime().traceInstructions(false);
Runtime.getRuntime().traceMethodCalls(false);
但我仍然可以看到生成的跟踪。你怎么能这么做呢?我还需要检测是否有人正在调试我的课程。
我想禁用所有异常跟踪。我不能使用混淆,因为我的产品是一个将在开发中使用的 SDK。我还提供了一个运行时,当人们想要部署使用我的 SDK 构建的应用程序时,可以使用它。我的要求是,任何使用我的运行时 jar 的人都不应该能够调试所编写的代码……或者至少我会通过避免从运行时 jar 生成堆栈跟踪来使调试变得困难。
我发现的一种方法是,所有源自运行时 jar 的异常,我都会捕获它们并在异常对象上设置一个空的 StackTraceElement 数组,然后重新抛出它...
为什么有这样的要求呢?
假设您使用我的 SDK 开发一个应用程序。(SDK jar 无法与您的应用程序捆绑在一起。我已经限制了它,这就是最终的:)!!)现在要在您的客户端计算机上运行您的应用程序,您(或客户端)需要安装在客户端机器上运行并运行您的应用程序。现在,如果您的客户开始使用我的运行时 jar 开发自己的应用程序怎么办?这对我的生意构成了威胁……这就是为什么这个可怕的要求。
为什么要禁用堆栈跟踪?
通过禁用堆栈跟踪生成或方法调用跟踪生成,我想让使用运行时 jar 开发代码变得困难,这就是为什么我以这种方式开始我的问题...请建议一些其他解决方案来实现这样的要求...
我也很好奇你为什么要这样做,但如果你真的有理由,你至少有两个选择:
如果您想为自己的异常实现禁用堆栈跟踪生成,您可以简单地重写 fillInStackTrace 方法:
public static class MyException extends Exception {
@Override
public Throwable fillInStackTrace() {
return this;
}
}
如果您想禁用它all异常,您可以使用字节码检测代理来替换 Throwable 类中的 fillInStackTrace 方法。然而,这仅适用于 Java 6,因为在 Java 5 中不允许您使用检测将本机方法 (fillInStackTrace) 替换为 Java 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)