一、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/zh-hant/n/286627.html