zoukankan      html  css  js  c++  java
  • Java 编程下使用 Class.forName() 加载类

    在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类。下面的范例让你可以指定类名称来获得类的相关信息。

    package cn.sunzn.demo;
    
    public class ClassDemo {
    
        public static void main(String[] args) {
    
            try {
                Class c = Class.forName(args[0]);
                System.out.println("类名称:" + c.getName());
                System.out.println("是否为接口:" + c.isInterface());
                System.out.println("是否为基本类型:" + c.isPrimitive());
                System.out.println("是否为数组:" + c.isArray());
                System.out.println("父类:" + c.getSuperclass().getName());
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("没有指定类名称");
            } catch (ClassNotFoundException e) {
                System.out.println("找不到指定的类");
            }
        }
    }

    在指定类给 forName() 方法后,如果找不到指定的类,会抛出 ClassNotFoundException 异常。Class 的静态 forName() 方法有两个版本,上面的代码是只指定类名称的版本,而另一个版本可以让你指定类名称、加载时是否运行静态区块、指定类加载器:

    Static Class forName(String name, boolean initialize, ClassLoader loader)

    默认在加载类的时候,如果类中有定义静态区块则会运行它。你可以使用 forName() 的第二个版本,将 initialize 设定为 false,这样在加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块。为了印证,可以先设计一个测试类。

    测试类:TestClass 

    package
    cn.sunzn.demo; public class TestClass { static { System.out.println("[运行静态区块]"); } }

    在测试类 TestClass 中只定义了静态区块显示一段信息,以观察静态区块何时被运行。可以设计范例 ForNameDemo1 使用第一个版本的 forName() 方法。

    测试类:ForNameDemo1

    package
    cn.sunzn.demo; public class ForNameDemo1 { public static void main(String[] args) { try { System.out.println("载入 TestClass "); Class c = Class.forName("cn.sunzn.demo.TestClass"); System.out.println("使用 TestClass 声明参考名称"); TestClass test = null; System.out.println("使用 TestClass 建立对象"); test = new TestClass(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("没有指定类名称"); } catch (ClassNotFoundException e) { System.out.println("找不到指定的类"); } } }

    运行结果如下:

    载入 TestClass 
    [运行静态区块]
    使用 TestClass 声明参考名称
    使用 TestClass 建立对象

    从运行结果中可以看到,第一版本的 forName() 方法在类加载之后,默认会立即运行静态代码块。下面来看范例 ForNameDemo2 中使用第二个版本的 forName() 方法会是如何。

    
    
    测试类:ForNameDemo2

    package
    cn.sunzn.demo; public class ForNameDemo2 { public static void main(String[] args) { try { System.out.println("载入 TestClass "); Class c = Class.forName("cn.sunzn.demo.TestClass", false, Thread.currentThread().getContextClassLoader()); System.out.println("使用 TestClass 声明参考名称"); TestClass test = null; System.out.println("使用 TestClass 建立对象"); test = new TestClass(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("没有指定类名称"); } catch (ClassNotFoundException e) { System.out.println("找不到指定的类"); } } }

    运行结果如下:

    载入 TestClass 
    使用 TestClass 声明参考名称
    使用 TestClass 建立对象
    [运行静态区块]

    由于使用第二个版本的 forName() 方法时,设定 initialize 为 false,所以加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块,第二个版本的 forName() 方法会需要一个类加载器,范例中所使用的是主线程的类加载器。

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/sunzn/p/3187868.html
Copyright © 2011-2022 走看看