簡體   English   中英

運行時的類

[英]class at runtime

有沒有辦法在運行時創建Java類@(類方法和變量),使用Java反射API

你不能用反射做到這一點。 您需要一個字節碼操作庫,如Jakarta BCEL

標准Java API提供了一組靜態方法,允許您動態創建實現一個(或多個)接口的類。 這些方法是java.lang.reflect.Proxy類的一部分。

你需要這個什么?

在一個非常松散的庄園里解釋這個問題我可以想到四個可能的選擇。

如果你有一個類,你也可以添加一些東西,你可能會發現面向Aspect的編程就是你真正想要的。

如果你有一個你想要動態實現的接口(由barjak發布)你想要的是java.lang.reflect.Proxy 這不允許在運行時創建“代碼”,而是允許您將現有代碼鏈接到接口。

最后(我知道三個)你實際上已經在運行時構建了隨機類。 這需要像cglibBCEL這樣的東西。 雖然有些情況需要這樣,但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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM