JAVA Class的运行方式

一、Run Java Class

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

java HelloWorld

如果希望将当前文件夹加入 CLASSPATH,可以执行:

java -cp . HelloWorld

如果还需要加入其他的 class 文件,则在当前目录下建立一个类似于下述的 Manifest 文件:

Main-Class: HelloWorld
Class-Path: commons-lang-2.4.jar log4j-1.2.15.jar

其中 Main-Class 指明了主程序入口,Content-Type 必须设置成 ASCII 或 ISO-8859-1,而 Class-Path 则设置了当前目录下需要的附加jar包所在的路径。

下面是执行时的命令。

java -jar HelloWorld.jar

二、打成 JAR 包

JAR(Java Archive)是一个打包工具,它可以将多个文件打成一个文件,方便传输和管理。

JAR 包不仅可以放置 class 文件,还可以放置其他任何文件。比如,如果你的应用程序需要读写某个文件,可以将文件放置在 JAR 包中。

JAR 文件格式是 ZIP 格式,但是还需要添加一个 manifset 文件,指定应用程序的入口。下面是一个例子:

Main-Class: com.demo.Main
Class-Path: libraries/one.jar libraries/two.jar

其中 Main-Class 表示应用程序的入口,Class-Path 表示附加的库文件。

打包命令如下:

jar cvfm HelloWorld.jar Manifest.txt HelloWorld.class

其中,cvfm 的意思是:“创建一个新的 JAR 文件,同时在 JAR 文件的 MANIFEST.MF 文件中指定创建者及入口类,接着把 files 列表的类文件进行打包”。

三、通过反射调用 Class

Class 可以帮助我们实现动态加载,即程序运行时才加载所需要的类,而不是在编译时就将所有代码都加载。

为了验证这种动态加载是否成功,我们需要在一个目录下创建一个People的类文件,代码如下:

public class People {

    private String name;

    public People() {}

    public People(String name) {
        this.name = name;
    }

    public void sayHello() {
        System.out.println("Hello, I am " + name);
    }
}

可以编写以下测试代码:

import java.lang.reflect.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String className = "People";
        Class cla = Class.forName(className);
        System.out.println("className=" + className + "\n" + "cla=" + cla + "\n");

        Constructor con = cla.getConstructor(String.class);
        Object obj = con.newInstance("Tom");
        System.out.println("obj=" + obj + "\n");

        Method met = cla.getMethod("sayHello");
        met.invoke(obj);
    }
}

运行程序输出以下结果:

className=People
cla=class People

obj=People@2503dbd3

Hello, I am Tom

上面的代码实现了动态创建 People 类,并通过反射获取构造函数和方法,最后通过类的实例实现了方法的调用。

四、基于Class的工厂模式

通过工厂模式可以更为方便地生成指定 Class 的对象实例。

例如,我们可以编写一个工厂类,通过反射机制,把一个字符串 className 转化为一个 Class 类型的变量,并利用 newInstance() 方法,生成相应的实例对象:

public class FruitFactory {
    public static Fruit getInstance(String className) throws Exception {
        Class cla = Class.forName(className);
        return (Fruit) cla.newInstance();
    }
}

然后就可以通过下列代码来实例化对象:

Fruit apple = FruitFactory.getInstance("apple");

这样即使类的字节码文件不在当前项目,也可以轻松创建对象实例。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 03:48
下一篇 2024-12-23 03:48

相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

    编程 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
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论