Commons DbUtils源码中底层方法的一个变更

一条大河波浪宽 发布于 2013/10/01 12:02
阅读 293
收藏 1

Apache的DBUtils包里有一个DbUtils的类。

今天看源码的时候注意到一个细节:

首先看这个方法

 /**
     * Loads and registers a database driver class.
     * If this succeeds, it returns true, else it returns false.
     *
     * @param classLoader the class loader used to load the driver class
     * @param driverClassName of driver to load
     * @return boolean <code>true</code> if the driver was found, otherwise <code>false</code>
     * @since 1.4
     */
    public static boolean loadDriver(ClassLoader classLoader, String driverClassName) {
        try {
            classLoader.loadClass(driverClassName).newInstance();
            return true;

        } catch (IllegalAccessException e) {
            // Constructor is private, OK for DriverManager contract
            return true;

        } catch (Exception e) {
            return false;

        }
    }
我们注意到,在加载驱动的时候,上面用的是ClassLoader的loadClass方法将类加载进来,然后newInstance()构造出一个实例,而我记得之前自己写jdbc的操作类的时候一般都用Class.forName()方法。

对此感到比较奇怪,但不知道原因,后来在官方的bug报告上发现了这个变动的原因:

官方说明:https://issues.apache.org/jira/browse/DBUTILS-81

他们解释了把之前的Class.forName替换成ClassLoader的loadClass方法的原因:

Description

The Class.forName() statement should be avoided due to potential OSGi issues - commons components are OSGi bundles!
The ClassLoader should be used instead to load classes and add a new method to pass custom ClassLoader.

大致意思就是:为了避免在OSGI中的一个问题,所以才进行了替换。

嗯,由于没接触过OSGI,所以希望大神能够给简单说明一下......

返回顶部
顶部