JAVA Class的运行方式

发布时间:2023-05-18

一、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");

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