2011-11-01 55 views
2

給定抽象父類動態生成專業化類的最佳方法是什麼?動態生成專業化類

例如,讓我們說這是我的父類:

public abstract class Parent { 

    public Parent(int i) { 
     // initialization here ... 
    } 

    @AnImportantAnnotation("") 
    public abstract Object testMethod(); 
} 

然後我想有接收它的一個抽象類,收益和實例,例如像一個方法:

public class Manager { 
    public static <T> T getInstance(Class<T> c) { 
     return <"instance of dynamically generated specialization class">; 
    } 

    public static void main(String[] args) { 
     Parent parent = getInstance(Parent.class); 
    } 
} 

getInstance方法返回的實例的類將覆蓋Parent類中的抽象方法。這些生成方法的代碼取決於其相應父方法的註釋。

另外,生成的類應該定義與其父類相同的構造函數。例如,生成的類應該等於:

public class Son extends Parent { 

    //generated constructor 
    public Son(int i) { 
     super(i); 
    } 

    public Object testMethod() { 
     // dynamically generated behaviour guided by annotations on the overridden method 
     return aReturnValue; 
    } 
} 

我寧願指針如何做到這一點僅僅從內存(文件到硬盤中沒有讀/寫),如果可能,而無需使用外部庫(例如, Javassist進行)。但是,依賴於這些庫的技術的解釋也受到高度讚賞。 非常感謝您的幫助。

+0

+1:我真的很喜歡從內存中看到一個完全使用JavaCompiler的答案(沒有讀/寫文件到磁盤),並且可以使用指定的'ClassLoader'在編譯時搜索類! –

+0

我剛剛在問題中包含了你的評論,@BrunoReis。這確實是一個很好的觀察,謝謝! – Sergio

回答

-1

對於類,我認爲沒有Javassist這樣的庫是不可能的,但是,如果您可以使用接口而不是抽象類,則可以使用java.lang.reflect.Proxy