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

Java 故障安全类加载的最佳实践,java,Java,在我的示例中,我有一个从给定类名加载类的方法。由于此方法必须是故障安全的(并且是智能的),因此我按照以下顺序编写了几种加载类的方法: 使用当前线程类加载器: Thread.currentThread().getContextClassLoader().loadClass(类名) 如果上述操作失败,则使用forName: Class.forName(className) 如果上述操作失败,则使用util类的类加载器: ClassLoaderUtil.class.getClassLoader().

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

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

    Thread.currentThread().getContextClassLoader().loadClass(类名)

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

    Class.forName(className)

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

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

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

    callingClass.getClassLoader().loadClass(类名)


您认为这是一个好的订单和/或应该删除/添加一些步骤吗?Thanx.

通常,您只需提供一个方法,调用方直接提供
类加载器
,这将消除1)和4)(例如TCCL和callingClass.getClassLoader()

大多数处理动态类加载的库都提供了两种方法,一种是使用您描述的默认查找策略,另一种是只使用给定的类加载器

请记住,可能存在昂贵的类加载器,因此这些loadClass()方法的每次尝试和错误调用都可能触发远程连接(例如在小程序中)甚至数据库查找(是的,我也看到了)。在这种情况下,最好有办法注入我自己的类加载器实例,例如缓存或黑名单资源


我觉得默认策略的工作顺序很好。最重要的是TCCL,因为这是在容器中运行时的最佳方法。

thanx。在回顾了我的代码之后,我正要添加一个带有类加载器作为参数的方法,尽管这样的方法是伪的(只是loadClass():);这就是为什么它一开始就不见了。无论如何,有一个故障保护方法很好-最近我遇到了一个情况,线程类加载器为null,所以必须使用另一个类加载器:)但是,我仍然怀疑在2之前使用#3是否更好。。。不知何故,对于Class.loadClass,您不知道将得到哪个类加载器?Class.forName()是特殊的,因为它使用调用类的类加载器。(请参阅Sun JDK中的ClassLoader.getCallerClassLoader())经过一些调查,我决定选择以下方法,如下所述:我还希望能够加载数组类。对于这个类,forName也很重要。