Java 编程如何使用 Class.forName() 加载类
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() 方法会需要一个类加载器,范例中所使用的是主线程的类加载器。
到此这篇关于Java 编程如何使用 Class.forName() 加载类的文章就介绍到这了,更多相关Java Class.forName() 加载类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud Netfilx Ribbon负载均衡工具使用方法介绍
Ribbon是Netflix的组件之一,负责注册中心的负载均衡,有助于控制HTTP和TCP客户端行为。Spring Cloud Netflix Ribbon一般配合Ribbon进行使用,利用在Eureka中读取的服务信息,在调用服务节点时合理进行负载2022-12-12Component和Configuration注解区别实例详解
这篇文章主要为大家介绍了Component和Configuration注解区别实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11基于JavaSwing+mysql开发一个学生社团管理系统设计和实现
项目使用Java swing+mysql开发,可实现基础数据维护、用户登录注册、社团信息列表查看、社团信息添加、社团信息修改、社团信息删除以及退出注销等功能、界面设计比较简单易学、适合作为Java课设设计以及学习技术使用,需要的朋友参考下吧2021-08-08Spring Boot在Web应用中基于JdbcRealm安全验证过程
这篇文章主要为大家介绍了Spring Boot在Web应用中基于JdbcRealm安全验证过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>2023-02-02
最新评论