在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 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() 方法会需要一个类加载器,范例中所使用的是主线程的类加载器。

完全引用自: http://www.cnblogs.com/sunzn/p/3187868.html   非常清晰,赞哒哒

Java 编程下使用 Class.forName() 加载类【转】的更多相关文章

  1. Java 编程下使用 Class.forName() 加载类

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

  2. Java从Jar文件中动态加载类

    动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...

  3. Java 编程下简介 Class 与类加载

    即使有一个类并对它一无所知,但其实它本身就包含了许多信息,Java 在需要使用到某个类时才会将类加载,并在 JVM 中以一个 java.lang.Class 的实例存在.从 Calss 实例开始,可以 ...

  4. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  5. [改善Java代码]使用forName动态加载类文件

    动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...

  6. java中class.forName和classLoader加载类的区分

     java中class.forName和classLoader都可用来对类进行加载.前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块.而classLoade ...

  7. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  8. java加载类的方法1.classloader 2.class.forName()

    java加载类的方法1.classloader 2.class.forName() 加载一个类后,是在方法去创建这个类的元信息class对象,在方法区立刻创建.在方法区创建.

  9. JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了

    JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了 代码示例 转自 https://docs.oracle.com/javase/tutorial/jdbc/o ...

随机推荐

  1. 【转】进程同步之信号量机制(pv操作)及三个经典同步问题

    原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源 ...

  2. WinForm(WPF) splash screen demo with C#

    https://www.codeproject.com/Articles/21062/Splash-Screen-Control https://www.codeproject.com/Article ...

  3. 键盘事件(keyup、keydown、keypress)

    1.onkeyup 和onkeydown时,keyCode是不区分大小写的,会将小写字母自动转化为大写字母. 2 onkeypress时,区分大小写. 3兼容event.keyCode||event. ...

  4. js返回值 数组去重

    function myfun(arr){ var arr1 = new Array(); var len = arr.length; ;i <len ;i++){ ) { arr1.push(a ...

  5. [转帖]浪潮openstack的逆袭

    扬长补短 浪潮云平台的逆袭 http://blog.itpub.net/11310314/viewspace-2564083/ 浪潮并不是最早加入OpenStack的国内厂商,却实现同比303.1%的 ...

  6. Jquery 事件冒泡、元素的默认行为的阻止、获取事件类型、触发事件

    $(function(){// 事件冒泡 $('').bind("click",function(event){ //事件内容 //停止事件冒泡 event.stopPropaga ...

  7. Node http和express和mysql

    const http = require("http");const express = require("express");const mysql = re ...

  8. 从网上整理的一些delphi字符串加密解密方法

    function Encode(Str: string): string; var //加密 TmpChr: AnsiChar; i, Len: integer; begin Result := St ...

  9. js screen

    windows.screen對象包含包含對象屏幕的信息: screen.availheight;屏幕高度 screen.availwidth;屏幕寬度

  10. js語句

    js語句就是告訴瀏覽器要做什麼: js代碼就是js語句序列: js代碼塊就是{}包括的,函數就是一個代碼塊的典型例子: js注釋:單行注釋://,多行注釋:/**/ js對大小寫敏感: js語句可以不 ...