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

  1. package cn.sunzn.demo;
  2.  
  3. public class ClassDemo {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. try {
  8. Class c = Class.forName(args[0]);
  9. System.out.println("类名称:" + c.getName());
  10. System.out.println("是否为接口:" + c.isInterface());
  11. System.out.println("是否为基本类型:" + c.isPrimitive());
  12. System.out.println("是否为数组:" + c.isArray());
  13. System.out.println("父类:" + c.getSuperclass().getName());
  14. } catch (ArrayIndexOutOfBoundsException e) {
  15. System.out.println("没有指定类名称");
  16. } catch (ClassNotFoundException e) {
  17. System.out.println("找不到指定的类");
  18. }
  19. }
  20. }

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

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

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

  1. 测试类:TestClass
  2.  
  3. package cn.sunzn.demo;
  4.  
  5. public class TestClass {
  6.  
  7. static {
  8. System.out.println("[运行静态区块]");
  9. }
  10.  
  11. }

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

  1. 测试类:ForNameDemo1
  2.  
  3. package cn.sunzn.demo;
  4.  
  5. public class ForNameDemo1 {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. try {
  10. System.out.println("载入 TestClass ");
  11. Class c = Class.forName("cn.sunzn.demo.TestClass");
  12.  
  13. System.out.println("使用 TestClass 声明参考名称");
  14. TestClass test = null;
  15.  
  16. System.out.println("使用 TestClass 建立对象");
  17. test = new TestClass();
  18. } catch (ArrayIndexOutOfBoundsException e) {
  19. System.out.println("没有指定类名称");
  20. } catch (ClassNotFoundException e) {
  21. System.out.println("找不到指定的类");
  22. }
  23. }
  24. }

运行结果如下:

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

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

  1.  
  1. 测试类:ForNameDemo2
  2.  
  3. package cn.sunzn.demo;
  4.  
  5. public class ForNameDemo2 {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. try {
  10. System.out.println("载入 TestClass ");
  11. Class c = Class.forName("cn.sunzn.demo.TestClass", false, Thread.currentThread().getContextClassLoader());
  12.  
  13. System.out.println("使用 TestClass 声明参考名称");
  14. TestClass test = null;
  15.  
  16. System.out.println("使用 TestClass 建立对象");
  17. test = new TestClass();
  18. } catch (ArrayIndexOutOfBoundsException e) {
  19. System.out.println("没有指定类名称");
  20. } catch (ClassNotFoundException e) {
  21. System.out.println("找不到指定的类");
  22. }
  23. }
  24. }

运行结果如下:

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

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

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. Mysql查看连接端口及版本

    C:\Users\Administrator>mysql -uroot -pEnter password: *****Welcome to the MySQL monitor. Commands ...

  2. wpf-DataTemplate应用

    在WPF中,决定数据外观的是DataTemplate,即DataTemplate是数据内容的表现形式,一条数据显示成什么样子,是简单的文本还是直观的图形,就是由DataTemplate决定的.下面通过 ...

  3. .Net HttpClient 模拟登录微信公众平台发送消息

    1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...

  4. C# \\u8888类型的unicode转换为字符串方法

    1.双斜杠\\ 处理: 2.将编码分组,将编码转换为int,再转换为char. string sss = "\\u6c88\\u9633"; '; string[] arr = a ...

  5. Cookie 添加,读取,删除

    Name,value – 声明时 new Cookie(key,value); Path        - 默认值,即为当前保存cookie的这个serlvet所在的路径. 如果Cookie在这样的路 ...

  6. cas+tomcat+shiro实现单点登录-2-部署cas server到tomcat

    目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

  7. Microsoft Visual C++ 2005 SP1 Redistributable 安装错误

    1.在安装Microsoft Visual C++ 2005 SP1 Redistributable时报错:Command line option syntax error.Type Command ...

  8. 用jQuery与JSONP轻松解决跨域访问的问题【转】

    原文地址:http://www.jb51.net/article/46463.htm 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅 ...

  9. jquery mobile touch 实例

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  10. Hex文件

    那么什么是Hex文件呢?Intel Hex文件是由一行行符合Intel Hex文件格式的文本所构成的ASCII文本文件.在Intel Hex文件中,每一行包含一个Hex记录.这些记录由对应机器语言码和 ...