我有一个包含CLass的TrirdParty应用程序接口,比如说A。它有一个奇怪的静态块,如下所示:
class A
{
static
{
try
{
System.loadLibrary("libraryName");
}
catch(UnsatisfiedLinkError ue)
{
System.exit(0);
}
}
//other stuff
}我想用一个被覆盖的SecurityManager阻止对System.exit()的调用。但是,我希望在执行此static块之前重写SecurityManager,在此之后立即恢复原始的安全管理器。
我知道如何替换/覆盖/恢复SecurityManager。
我的问题是,我如何确定何时调用static块,以及何时加载类,以便在此之前我将使用自己的SecurityManager来阻止System.exit(),然后恢复原始SecurityManager。
请注意,仅在执行静态块时覆盖安全管理器的持续时间很重要。
编辑:
出于许可原因,不能选择更改源。
发布于 2011-04-06 06:15:52
为什么不能通过使用字节码压缩库来替换静态的{}块呢?
发布于 2011-04-06 07:08:38
我觉得你基本上吃得太多了。
是的,(至少在理论上)可以通过安全管理器阻止call System.exit()。但是接下来会发生什么呢?
尝试调用System.exit().
从理论上讲,您可以捕获异常。但这不会让您走得太远,因为JVM只会尝试执行一次静态初始化。如果失败,并且您再次尝试,则JVM将简单地抛出ClassNotFoundError (我认为),重复最初的异常作为原因。
让类初始化再次发生的唯一方法是丢弃最初加载违规类的类加载器,创建一个新的类加载器,然后再次开始加载。然后你又回到了原来的问题。
底线:如果你真的不能修改代码,那你就完蛋了。
即使你能做到这一点,这听起来也像是一个糟糕的解决方案/不能解决你的问题。LinkageError异常表示库无法加载本机库,并且库中相应的native方法调用将失败,并返回Error。在最好的情况下,你最终会得到一个库,其中一些位可以工作,另一些位不能工作。
您应该专注于为您的平台获取正确的本机库和/或配置JVM,以便它能够找到它。或者找到一个比第三方库更好的替代方案,这样就不会被侵入性的许可证强制执行所困扰。
https://stackoverflow.com/questions/5559182
复制相似问题