Class.forName(String className);今天在用这方法loader一class时,出现了AddCommand class not found的错误,刚开始以为是clasName 写错了,仔细检查后发现并不是这问题。打开jdk文档,看到className - the fully qualified name of the desired class.及例子中的 Class t = Class.forName("java.lang.Thread")
才恍然大悟,我们传进去的应该是完整的name(包括包路径)。
jdk上有这么一句话:Invoking this method is equivalent to: Class.forName(className, true, currentLoader), where currentLoader
denotes the defining class loader of the current class.就是说前者最后调用的还是后者,只不过是自动将后两个参数设成了default value. currentLoader 可以通过 this.getClass().getClassLoader()来获得。但这方法有可能返回null, 为什么呢? 这就涉及到类加载体系问题,如果这class由bootstrap loader, 返回的就是null. 那是不是说得到null,再往下调用就会出错,抛出exception呢?参看JDK文档,上面如下说明:If the loader
is null
, and a security manager is present, and the caller's class loader is not null,this method calls the security manager's checkPermission
method with a RuntimePermission("getClassLoader")
permission to ensure it's ok to access the bootstrap class loader.