java开发中Class.forName()加载类的使用方法详解

sunzn 2025-01-07 09:56:57编程技术
405

在Java开发中,动态加载类是一项非常重要的技术。它允许程序在运行时根据需要加载和使用类,从而提高程序的灵活性和可扩展性。Class.forName()方法是Java中最常用的动态加载类的方式之一。本文将详细介绍Class.forName()方法的使用方法,帮助读者更好地理解和应用这项技术。

java.webp

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() 方法会需要一个类加载器,范例中所使用的是主线程的类加载器。

总结

通过本文的介绍,我们可以看到Class.forName()方法的使用方法并不复杂。只需传入类的全限定名,就能轻松加载和使用类。掌握这些使用技巧,将有助于我们在实际开发过程中编写出更加灵活和可扩展的代码。希望本文的内容能够对读者有所帮助,欢迎大家在评论区分享自己的经验和见解。

java class.forname
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Java日志管理框架:Log4j、SLF4J、Logback对比与使用方法详解
java主流日志框架中,Log4j 1.x作为早期标准,Log4j 2.x通过重构实现性能飞跃,Logback作为Log4j的继承者以原生SLF4J支持成为主流选择,而SLF4J作为日志门面,通过抽象层实现...
2025-09-15 编程技术
524

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
505

JavaScript 中 instanceof 的作用及使用方法详解
在 JavaScript 的类型检查体系中,instanceof 是一个重要的操作符,用于判断一个对象是否属于某个构造函数的实例或其原型链上的类型。本文ZHANID工具网将系统讲解 instanceof...
2025-09-11 编程技术
497

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
495

JavaScript出现“undefined is not a function”错误的解决方法
在JavaScript开发中,TypeError: undefined is not a function 是最常见的运行时错误之一,通常表示代码尝试调用一个未定义(undefined)的值作为函数。本文ZHANID工具网将从...
2025-09-10 编程技术
511

Java集合框架:List、Set、Map的使用与区别详解
Java集合框架是JDK中提供的核心数据结构库,为开发者提供了高效、安全、可扩展的集合操作能力。本文ZHANID工具网将系统解析List、Set、Map三大核心接口的实现类及其使用场景,...
2025-09-09 编程技术
479