[英]class at runtime
有沒有辦法在運行時創建Java類@(類方法和變量),使用Java反射API
你不能用反射做到這一點。 您需要一個字節碼操作庫,如Jakarta BCEL 。
標准Java API提供了一組靜態方法,允許您動態創建實現一個(或多個)接口的類。 這些方法是java.lang.reflect.Proxy類的一部分。
你需要這個什么?
在一個非常松散的庄園里解釋這個問題我可以想到四個可能的選擇。
如果你有一個類,你也可以添加一些東西,你可能會發現面向Aspect的編程就是你真正想要的。
如果你有一個你想要動態實現的接口(由barjak發布)你想要的是java.lang.reflect.Proxy
。 這不允許在運行時創建“代碼”,而是允許您將現有代碼鏈接到接口。
最后(我知道三個)你實際上已經在運行時構建了隨機類。 這需要像cglib或BCEL這樣的東西。 雖然有些情況需要這樣,但IMO很少見。
另一個選擇是你不需要運行時而是需要構建時間。 在這種情況下,您可以使用注釋和apt
(Java 5)/ Processor
(Java 6)。
你可以使用javassist。 這是sudo代碼
javassist.ClassPool pool = new ClassPool(true);
CtClass bclass = pool.makeClass("brandnewclass);
bclass.addConstructor(CtNewConstructor.defaultConstructor(bclass));
CtClass[] fieldclasses = new CtClass[fields.length];
CtClass serClass = pool.get(Serializable.class.getName());
bclass.addInterface(serClass);
class clazz = pool.loadClass(“className”); obj = clazz.newInstance();
使用反射從現有類中提取值並將值分配給新類。 希望這可以幫助。 戈皮
當然有。 對於要創建的目標類,最初需要一個java.lang.Class實例。 根據您的結構,這可能由調用者傳入(如果他們提供他們想要創建的具體類),或者您可以靜態訪問類變量(例如MyFooImpl.class
)。
最簡單的方法是調用Class.newInstance() 。 這將調用默認的no-arg構造函數(假設該類有一個;如果不是,則拋出異常)。
如果需要使用某個參數調用特定構造函數,則需要調用Class.getConstructor()以獲取Constructor實例,然后可以調用newInstance 。
在所有情況下,您都需要處理直接調用構造函數時無法獲得的反射異常。
大編輯 :我假設你的問題是關於通過反射創建一個類的實例。 但是我開始認為你要求在運行時定義新的類。 如果是這樣,那么反射在這里不會幫助你 - 你需要以編程方式調用編譯器,我相信可以這樣做,但我不是100%的細節。 我想你也必須通過一些箍來讓ClassLoader接收你的新課程。
您可以使用Janino創建源代碼字符串並將其編譯為類文件。
正如人們已經提到的那樣,沒有辦法在運行時使用反射創建新類。 我知道的一個庫被不同的模擬庫使用,例如cglib 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.