如何检测ClassLoading的时间
我有一个包含CLass的TrirdParty API [让我们说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
。
请注意,仅在执行静态块的持续时间内覆盖安全管理器非常重要。
编辑:
由于许可原因,更改源不是一种选择。
没有找到相关结果
已邀请:
2 个回复
辽躺
藐刚
。但那会发生什么呢? 类中的静态初始化程序试图调用
。 SecurityManager说不,你不能抛出SecurityException 类的静态初始化因未捕获的异常而失败 您最初尝试初始化(隐式)的类的初始化失败。 理论上你可以捕获异常。但这并没有让你走得太远,因为JVM只会尝试执行一次静态初始化。如果失败了,你再试一次,JVM就会抛出
(我想),重复原来的异常作为原因。 让类初始化再次发生的唯一方法是丢弃首先加载违规类的类加载器,创建一个新的,然后再次开始加载。然后你又回到了原来的问题。 底线:如果你真的无法改变代码,那么你就被塞满了。 即使你能做到这一点,听起来也不是解决你的问题的解决方案。 LinkageError异常意味着库无法加载本机库,并且相应的
方法调用库将失败并且
。在最好的情况下,你最终会得到一个库,其中一些位工作而其他位不工作。 您应该专注于为您的平台获取正确的本机库和/或配置JVM以便它可以找到它。或者找到一个更好的替代第三方库,而不受侵入式许可执法废话的困扰。