在我的Jodd library中,我有一个从给定类名加载类的方法。由于此方法必须是故障安全的(并且是智能的),我编写了几种按以下顺序加载类的方法:
使用当前线程类加载器:
Thread.currentThread().getContextClassLoader().loadClass(className);
如果上述失败,则使用forName
:
Class.forName(className);
如果失败,则使用util类的类加载器:
ClassLoaderUtil.class.getClassLoader().loadClass(className);
并且,如果给出了可选的Class参数,则使用其类加载器:
callingClass.getClassLoader().loadClass(className);
您认为这是一个好订单和/或应该删除/添加一些步骤吗?感谢名单。
答案 0 :(得分:2)
通常,您只需提供一种方法,其中调用者直接提供ClassLoader
- 这将消除1)和4)(例如TCCL和callingClass.getClassLoader())。
大多数处理动态类加载的库提供了两种方法,一种是在描述时使用默认查找策略,另一种是仅使用给定的ClassLoader。
请记住,可能存在昂贵的ClassLoader,因此这些loadClass()方法的每次试错调用都可能触发,例如远程连接(例如在Applet中)甚至是数据库查找(是的,我也见过)。在这种情况下,有一种方法可以注入我自己的ClassLoader实例,例如用于缓存或将资源列入黑名单。
默认策略的工作顺序对我来说似乎不错。最重要的一个肯定是TCCL,因为这是在容器中运行时的最佳方法。