一、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");
这样即使类的字节码文件不在当前项目,也可以轻松创建对象实例。