以Java执行Class为中心

一、Java执行Class的概述

Java是一种面向对象的编程语言,它的核心思想之一就是通过Class来实现面向对象的编程。在Java中,每个类都是由一个或多个Class组成的,Class代表了一个Java类或者接口的元信息。Java程序在执行时需要加载和连接Class,然后才能够对其进行实例化和调用操作。因此,在Java中,以Java执行Class为中心是非常重要的。

二、Java执行Class的分类

Java执行Class可以分为以下三种类型:

1.系统类

系统类是由Java虚拟机(JVM)提供的类,例如java.lang.Object、java.lang.String等。这些类通常位于JVM的class路径下,可以被整个JVM使用。

public class SystemClass {
    public static void main(String[] args) {
        Object obj = new Object();
        String str = new String("Java");
        System.out.println(obj.getClass());
        System.out.println(str.getClass());
    }
}

2.应用类

应用类是用户自定义的类,它们通常被应用程序开发者编写并打包成jar文件,然后在应用程序中进行使用。应用类可以通过Java的类加载机制进行加载。

public class ApplicationClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        System.out.println(myClass.getClass());
    }
}

class MyClass {
    // some code...
}

3.扩展类

扩展类是由JVM扩展提供的类,例如javax.swing.JFrame、javax.swing.JButton等。这些类通常位于JRE的扩展目录下,可以被整个JVM使用。扩展类也可以通过Java的类加载机制进行加载。

public class ExtensionClass {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JButton button = new JButton("Click me");
        frame.add(button);
        frame.setSize(300, 200);
        frame.setVisible(true);
        System.out.println(frame.getClass());
        System.out.println(button.getClass());
    }
}

三、Java执行Class的加载

Java程序在执行时,需要从磁盘、网络等地方获取Class字节码并将其加载到内存中,然后才能够对其进行实例化和调用操作。Java使用类加载器来完成Class的加载任务。类加载器可以分为以下三种:

1.引导类加载器

引导类加载器是虚拟机自身的一部分,它负责加载JVM需要的基础类,如java.lang.Object、java.lang.String等。这些类在整个Java应用程序中都是可以被访问的。

2.扩展类加载器

扩展类加载器负责加载JRE扩展目录下的Class,例如javax.swing.JFrame等。这些类在整个Java应用程序中都是可以被访问的。

3.应用程序类加载器

应用程序类加载器负责加载应用程序的Class,例如用户自定义的Class。这些类只在应用程序内部被访问。

public class ClassLoaderDemo {
    public static void main(String[] args) {
        // 获取当前线程的类加载器
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // 加载org.springframework.jdbc.core.JdbcTemplate类
        try {
            Class clazz = classLoader.loadClass("org.springframework.jdbc.core.JdbcTemplate");
            System.out.println(clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

四、Java执行Class的链接

Java程序在加载完Class之后,需要进行链接操作,包括验证、准备和解析三个步骤。

1.验证

验证步骤用来确保所加载的Class是符合Java规范的,包括格式检查、语义检查、字节码检查等。

2.准备

准备步骤用来分配所加载的Class所需的空间,并设置默认值。例如,对于一个int型的成员变量,它将会被分配4个字节的空间,并设置为0。

3.解析

解析步骤用来将被加载的Class中的符号引用解析为实际引用,并进行相关的链接处理,如常量池解析、类或接口的解析等。

public class LinkageDemo {
    public static void main(String[] args) {
        LinkageDemo demo = new LinkageDemo();
        demo.sayHello();
    }

    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

五、Java执行Class的初始化

Java程序在链接完Class之后,还需要进行初始化操作,包括静态变量赋值、静态代码块调用等。Java采用了Lazyloading的思想,即在第一次使用该Class时才会进行初始化。

public class InitializationDemo {
    static {
        System.out.println("InitializationDemo被初始化了");
    }

    public static void main(String[] args) {
        // 输出InitializationDemo被初始化了
        System.out.println("Hello, World!");
    }
}

六、Java执行Class的卸载

Java程序在执行时,如果某一个Class已经不再使用,那么它将会被JVM的垃圾回收器回收。当一个Class被回收之后,可以对其进行重新加载和执行操作。

public class UnloadingDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        // 创建一个自定义类加载器
        MyClassLoader loader = new MyClassLoader();
        // 加载并执行HelloWorld类
        Class clazz = loader.loadClass("HelloWorld");
        try {
            clazz.getMethod("sayHello").invoke(clazz.newInstance());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 卸载HelloWorld类
        ((MyClassLoader) clazz.getClassLoader()).unloadClass("HelloWorld");
    }
}

class MyClassLoader extends ClassLoader {
    private Map<String, Class> classes = new HashMap();

    @Override
    protected Class findClass(String name) throws ClassNotFoundException {
        byte[] classBytes = getClassBytes(name);
        Class clazz = defineClass(name, classBytes, 0, classBytes.length);
        classes.put(name, clazz);
        return clazz;
    }

    private byte[] getClassBytes(String name) throws ClassNotFoundException {
        try {
            InputStream is = ClassLoader.getSystemResourceAsStream(name.replace(".", "/") + ".class");
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buff = new byte[2048];
            int len = 0;
            while ((len = is.read(buff)) != -1) {
                outputStream.write(buff, 0, len);
            }
            return outputStream.toByteArray();
        } catch (Exception e) {
            throw new ClassNotFoundException(name);
        }
    }

    public void unloadClass(String name) {
        classes.remove(name);
    }
}

class HelloWorld {
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/155206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-17 02:40
下一篇 2024-11-17 02:40

相关推荐

  • Idea新建文件夹没有java class的解决方法

    如果你在Idea中新建了一个文件夹,却没有Java Class,应该如何解决呢?下面从多个方面来进行解答。 一、检查Idea设置 首先,我们应该检查Idea的设置是否正确。打开Id…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • ArcGIS更改标注位置为中心的方法

    本篇文章将从多个方面详细阐述如何在ArcGIS中更改标注位置为中心。让我们一步步来看。 一、禁止标注智能调整 在ArcMap中设置标注智能调整可以自动将标注位置调整到最佳显示位置。…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29

发表回复

登录后才能评论