故障安全类加载的最佳实践

时间:2011-01-17 18:28:53

标签: java

在我的Jodd library中,我有一个从给定类名加载类的方法。由于此方法必须是故障安全的(并且是智能的),我编写了几种按以下顺序加载类的方法:

  • 使用当前线程类加载器:

    Thread.currentThread().getContextClassLoader().loadClass(className);

  • 如果上述失败,则使用forName

    Class.forName(className);

  • 如果失败,则使用util类的类加载器:

    ClassLoaderUtil.class.getClassLoader().loadClass(className);

  • 并且,如果给出了可选的Class参数,则使用其类加载器:

    callingClass.getClassLoader().loadClass(className);

您认为这是一个好订单和/或应该删除/添加一些步骤吗?感谢名单。

1 个答案:

答案 0 :(得分:2)

通常,您只需提供一种方法,其中调用者直接提供ClassLoader - 这将消除1)和4)(例如TCCL和callingClass.getClassLoader())。

大多数处理动态类加载的库提供了两种方法,一种是在描述时使用默认查找策略,另一种是仅使用给定的ClassLoader。

请记住,可能存在昂贵的ClassLoader,因此这些loadClass()方法的每次试错调用都可能触发,例如远程连接(例如在Applet中)甚至是数据库查找(是的,我也见过)。在这种情况下,有一种方法可以注入我自己的ClassLoader实例,例如用于缓存或将资源列入黑名单。

默认策略的工作顺序对我来说似乎不错。最重要的一个肯定是TCCL,因为这是在容器中运行时的最佳方法。

相关问题