首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测ClassLoading的时间

如何检测ClassLoading的时间
EN

Stack Overflow用户
提问于 2011-04-06 06:11:07
回答 2查看 198关注 0票数 3

我有一个包含CLass的TrirdParty应用程序接口,比如说A。它有一个奇怪的静态块,如下所示:

代码语言:javascript
复制
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

请注意,仅在执行静态块时覆盖安全管理器的持续时间很重要。

编辑:

出于许可原因,不能选择更改源。

EN

回答 2

Stack Overflow用户

发布于 2011-04-06 06:15:52

为什么不能通过使用字节码压缩库来替换静态的{}块呢?

票数 1
EN

Stack Overflow用户

发布于 2011-04-06 07:08:38

我觉得你基本上吃得太多了。

是的,(至少在理论上)可以通过安全管理器阻止call System.exit()。但是接下来会发生什么呢?

尝试调用System.exit().

  • SecurityManager时,类中的SecurityException

  • Static静态初始化器会说不能,并抛出类的exception

  • Initialization初始化失败,导致
  1. 初始化失败,您最初尝试初始化的类(隐式地)失败。

从理论上讲,您可以捕获异常。但这不会让您走得太远,因为JVM只会尝试执行一次静态初始化。如果失败,并且您再次尝试,则JVM将简单地抛出ClassNotFoundError (我认为),重复最初的异常作为原因。

让类初始化再次发生的唯一方法是丢弃最初加载违规类的类加载器,创建一个新的类加载器,然后再次开始加载。然后你又回到了原来的问题。

底线:如果你真的不能修改代码,那你就完蛋了。

即使你能做到这一点,这听起来也像是一个糟糕的解决方案/不能解决你的问题。LinkageError异常表示库无法加载本机库,并且库中相应的native方法调用将失败,并返回Error。在最好的情况下,你最终会得到一个库,其中一些位可以工作,另一些位不能工作。

您应该专注于为您的平台获取正确的本机库和/或配置JVM,以便它能够找到它。或者找到一个比第三方库更好的替代方案,这样就不会被侵入性的许可证强制执行所困扰。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5559182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档