在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 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. 菜鸟教程--AJAX

    一.简介1.AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.2.AJAX = 异步 JavaScript 和 XML.3.通过在后台与服务器进行少量数据交换,AJAX 可以使网 ...

  2. CentOS(6.8)7 安装 Mysql 5.7

    https://blog.csdn.net/zyw_java/article/details/70949596 https://blog.csdn.net/yzl11/article/details/ ...

  3. Max length of title attribute in html

    测了一下chrome是1024个utf-8字符. 具体可见: http://stackoverflow.com/questions/8516235/max-length-of-title-attrib ...

  4. 表格属性和BFC(block framing content)

    th和tr都是表示列但是 th有一个居中加粗的效果. 表单是由 : 1表单域:<form name=" " method="get/post"  acti ...

  5. CentOS7 完整安装后创建私有的yum仓库

    1. 安装 CentOS7 安装的包比较全,应用可以直接用. 2. 第一步创建 yum 包的存放路径 mkdir -p /var/www/html/ 3. 创建私有仓库 createrepo -v / ...

  6. [工作相关] 一个虚拟机上面的SAP4HANA的简单使用维护

    1.公司组织竞品分析, 选择了SAP的 SAP4HANA作为竞品 这边协助同事搭建了SAP4HANA的测试环境: 备注 这个环境 应该是同事通过一些渠道获取到的. 里面是基于这个虚拟机进行的说明:: ...

  7. mysql登录密码相关

    设置root登录密码 方法一:用root 进入mysql后 mysql>set password =password('你的密码'); mysql>flush privileges; 方法 ...

  8. OpenJS Foundation

    OpenJS Foundation Introducing the OpenJS Foundation https://openjsf.org/ The Node.js Foundation and ...

  9. QueryParser 是对一段话进行分词的 用于收集客户端发来的

  10. linux需要你的不懈努力

    自己二十几年的求学生涯,总结出:天赋固然重要,但是最为重要的还是要有一个持之以恒的心,而且还要有科学的学习方法,不只是针对今天的主题linux,无论我们从事什么行业这都是不变的法则. 刚刚从一个稚嫩的 ...