Java类加载详细过程:加载、验证、准备、解析、初始化

需积分: 0 0 下载量 106 浏览量 更新于2024-08-05 收藏 91KB PDF 举报
"这篇文档详细介绍了Java类加载的过程,包括加载、验证、准备、解析和初始化这五个阶段。其中,加载阶段涉及从不同来源获取类的二进制流,并将其转化为运行时的数据结构。验证阶段则对二进制数据进行校验,确保其符合Java虚拟机规范。准备阶段为类变量分配内存并设置初始值。解析阶段则是将符号引用转换为直接引用。初始化阶段执行类的静态初始化语句。" 在Java中,类加载是程序运行的关键步骤,它确保类的信息正确无误地被引入到运行环境中。以下是每个阶段的详细解释: 1. **加载**: - 加载阶段是类加载的第一步,主要任务是从指定的位置获取类的二进制数据,这可能来自JAR包、网络、动态生成或数据库等。 - 加载完成后,虚拟机将二进制数据转化为方法区的运行时数据结构,并创建一个代表该类的Class对象,作为访问方法区数据的入口。 - 对于非数组类,加载可以通过系统引导类加载器或用户自定义的类加载器完成,而数组类由Java虚拟机直接创建。 2. **验证**: - 验证阶段是为了确保即将运行的代码安全可靠,它检查类文件的结构是否符合Java虚拟机规范,包括文件格式、元数据、字节码和符号引用的校验。 - 这个阶段可以优化以提高加载速度,例如通过-Xverify:none参数关闭大部分校验。 3. **准备**: - 准备阶段,类的静态变量在此阶段被分配内存空间,并赋予它们的默认初始值,例如int类型的变量会初始化为0,引用类型会初始化为null。 - 这个阶段不涉及任何用户代码的执行,只是简单的内存分配。 4. **解析**: - 解析阶段,虚拟机将符号引用转换为直接引用,这是为了后续方法调用和字段访问提供方便。 - 符号引用是一种抽象的引用方式,而直接引用可以直接指向内存中的目标。 5. **初始化**: - 最后,初始化阶段执行类的静态初始化语句,比如静态变量的显式赋值、静态块的执行等。 - 当类首次被主动使用时,如创建类的实例、访问静态变量或方法、反射调用类的静态方法等,才会触发初始化。 了解类加载过程对于理解Java程序的运行机制至关重要,尤其在进行性能优化、安全控制或者实现自定义类加载器时,这些知识显得尤为重要。此外,理解类加载的不同阶段也有助于开发者避免在编程过程中引入潜在的问题,比如类加载的顺序错误或安全漏洞。

public void start(Stage primaryStage) throws Exception { String CONNECTION_URL = "jdbc:hive2://192.168.88.100:10000/default"; String USERNAME = "root"; String PASSWORD = "123456"; String JDBC_DRIVER = "org.apache.hive.jdbc.HiveDriver"; // 加载 Hive JDBC 驱动 Class.forName(JDBC_DRIVER); // 建立 JDBC 连接 Connection conn = DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT data FROM picture_01 WHERE dt = '2023-07-13'"; ResultSet rs = stmt.executeQuery(sql); // 处理查询结果 while (rs.next()) { // 处理数据,例如打印输出 System.out.println(rs.getBinaryStream("data")); } // 从 Hive 数据库获取二进制数据的输入流对象 InputStream inputStream = rs.getBinaryStream("data"); // 将输入流对象转换为 BufferedImage 对象 BufferedImage bufferedImage = ImageIO.read(inputStream); // 转换 BufferedImage 为 JavaFX 的 Image 对象 Image image = SwingFXUtils.toFXImage(bufferedImage, null); System.out.println("1"); // 创建图像视图 ImageView imageView = new ImageView(image); // 创建场景,并将图像视图添加到场景中 Scene scene = new Scene(imageView.getParent()); // 设置舞台并显示场景 primaryStage.setTitle("Image Viewer"); primaryStage.setScene(scene); primaryStage.show(); // 关闭连接和释放资源 rs.close(); stmt.close(); conn.close(); // 关闭输入流 inputStream.close(); } }此代码报错上述代码报错java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)什么原因

2023-07-17 上传