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

要回复问题请先登录注册