一、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