簡體   English   中英

如何在java中動態創建一個類

[英]How to create a class dynamically in java

我不知道這是否可能。 無論如何,這是我的問題:我想創建一個具有數據庫表架構的類,例如假設我有一個像

id - unsigned int 
username - varchar(128)
password - varchar(128)

假設我可以從我的數據庫中查詢這些數據。 我想要做的是動態創建(當然還有實例化)一個應該如下所示的 Java 類:

public class User{
    private unsigned int id;
    private String username;
    private String password;
}

(實際上是我表的ActiveRecord

你能幫我開始嗎? 坦克

你會用一個你的其他代碼都不知道的動態創建和實例化的類來做什么?

對於像 Java 這樣的靜態類型語言,擁有這樣的類毫無意義。 另一方面,像 Hibernate 這樣的大多數 OR 映射器都帶有允許您從數據庫模式靜態生成類的工具。

從技術上講,您可以通過字節碼操作庫 - CGLIB、javassist、asm、bcel 等。

然而,這不是 Java 的“哲學”。 Java 是靜態類型的,因此您最好在運行之前創建類。

看看 Java ORM 的hibernate / eclipseLink - 一種將表映射到對象的方法。

我想你想要的是java.lang.reflect.Proxy和相關類提供的工具。

是一篇很好的文章開始,但您確定需要實際創建一個新類嗎? 也許你可以只使用地圖?

就像@Bozho 所說的那樣,Java 是一種靜態類型語言,在運行時生成類只會導致混亂。

在我們的世界中,在構建時生成類要方便得多,也就是說在編譯期間。 通常,使用Hibernate 逆向工程,您可以在構建時從您的 DB 模式構建您的 Java 類,並將這些類部署到您的應用程序中,這為您提供真實的 Java 代碼以供閱讀,並保證您的代碼將綁定到您的數據庫模式

該條款對“新”的編譯器API,為Java文檔JavaCompiler展示如何編譯java源從方式String對象。 (我不知道我們是否可以編譯為輸出流並將類文件加載到內存中...)

您可以稍后使用URLClassLoader加載類文件並創建實例(記錄/調用 API)

這是一個不錯的基於 CGLib 的解決方案:

http://code.google.com/p/cglib-wrappers/wiki/Wrappers

是的,可以在運行時編譯類。 我之前在遺傳算法研究中做過。 它可以使用編譯器的內置接口。 Java World 上的一篇文章描述了基本方法: http : //www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html?page=3

您可以生成 Java 源文本並使用 javax.tools 包來編譯它並使用類加載器來加載它。 谷歌搜索產生了一些如何完成的例子,但我從未嘗試過這樣的事情,所以我不知道你可能會遇到什么問題。 顯然,Java 不是為這些事情而設計的。

老問題,如果可能的話,您應該避免在運行時生成類,但有時您必須這樣做。 所以你可以使用Javassist,這里是例子......

我在這里創建了一個小例子: http : //hrabosch.com/2018/04/08/generate-class-during-runtime-with-javassist/

但這里是要點:

public static Class generateClass(String className, String methodName, String methodBody)
  throws CannotCompileException {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass(className);
StringBuffer method = new StringBuffer();
method.append("public void ")
      .append(methodName)
      .append("() {")
      .append(methodBody)
      .append(";}");
cc.addMethod(CtMethod.make(method.toString(), cc));
return cc.toClass();
}

所以我做了什么......通過Javassist我在ClassPool中創建了一個類。 我還在這個類中添加了一個方法,並通過反射調用了它。

希望能幫助到你。

請記住,無論您想在生成的類中使用什么,都沒有導入,因此您必須使用完全限定的名稱。

我想最終目標是使用類似 ActiveRecord 的代碼來編寫 DB 訪問。 如果是這種情況,您可以查看 ActiveRecord 的 Java 實現: http : //code.google.com/p/activejdbc/

干杯,

伊戈爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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