簡體   English   中英

如何以編程方式創建Java文件

[英]how to create java file programmatically

我正在創建一個util.class,該類編寫充當掩蓋生成器的.java Files

該實用程序類將生成AConverter.java'(請參見下面的示例)

我想知道如何編寫util-class。
我用谷歌搜索,發現推薦使用apache bcel。 但是我找不到從String編寫.java File並使之在我的程序中運行的示例。



期望是...

class ADTO
{
    private String empId;
    private String empName;
    private String dept;

    //setters and getters
}

class ABO
{
    private String loginId;
    private String userName;
    private String group;

    //setter and getter
}

class AConverter
{
    public void doConvertFromDB(ADTO source, ABO dest)
    {
        dest.setLoginId(source.getEmpId());
        ...
    }

    public void doConvertFromBO(ABO source, ADTO dest)
    {
        dest.setEmpId(source.getLoginId());
        ...

    public ADTO getSourceClass()
    {
        return ADTO.class;
    }

    public ABO getDestClass()
    {
        return ABO.class;
    }
}

上面的類AConverter將由新的Util類生成。

您幾乎肯定會從嘗試以其他方式進行操作中受益,該方案可能失敗的方式數量之多令人擔憂。 這里有一些建議:

  1. 添加某種類型的Caster方法:

     class ADTO { private String empId; private String empName; private String dept; // setters and getters public ABO toABO() // caster method (ABO will need a toADTO() as well) { ABO a = new ABO(); a.setSomething(getSomethingEquivalent()); ... return a; } } 
  2. 代理類,可能是預期類的子類。 您將需要2個,每個類派生一個。

     class ADTO_Proxy extends ADTO { private ABO abo; public ADTO_Proxy(ABO a) { super(); abo = a; } @override public String getEmployeeId() { return abo.getLoginId(); } // other setters and getters } 
  3. 合並類,而不是嘗試制作適配器。 可以通過以下操作輕松完成:

     class ADTO { private String empId; private String empName; private String dept; // getters and setters for each variable by each name public String getEmployeeId() { return empId; } public String getLoginId() { return empId; } public String getEmployeeName() { return empName; } public String getUsername() { return empName; } public String getDepartment() { return dept; } public String getGroup() { return dept; } // setters } 

    這也可以通過接口來完成。

HateYourselfLater™評分:

第一種方法的排名為2,是三種方法中最好的。 贏得評級是因為您永遠不會發現自己在兩者之間意外切換,並且無需更改太多其他代碼。

第二種方法將-3置於三個的中間。 之所以能獲得評分,是因為您有時會混淆另一種類型的對象,並可能產生意想不到的副作用。 如果從代理類中省略設置器,則可以將其降低到0級,但這會限制功能。

第三種方法得到-5,這是三種方法中最差的。 獲得評級是因為存在很多副作用,並且冗余代碼可能會在以后使您絆倒。 但是,您可以通過重構所有內容以僅使用一個類來使比率為1,但這可能會花費很多工作,並且您現在會為此而討厭自己。

就是說,您最初的想法是即時生成一個類,以在兩個等級之間轉換大約-10,因為這將非常難以維護,並且對基礎類的任何更改都非常敏感,並且很容易打破。

HateYourselfLater™評分范圍從-10到10,其中10是最大的贊,而-10是最大的恨。

原始答案:

您需要反編譯器。 有幾種Java反編譯器可供選擇,下面列出一些:

  • Showmycode-易於使用,體面的反編譯, 在線 (因此不適合公司材料),內置類名稱的錯誤處理和嵌套的匿名類
  • Jad-可下載,CLI,可以工作,但是會產生難看的代碼,Linux版本已過時(如有必要,請在Windows版本中使用wine),搞砸枚舉,foreach循環以及一些try / catching
  • Fernflower-CLI,很難找到,這三者的最佳輸出,作者是SO用戶,看起來像樣的輸出,有時搞亂try / catching

它們都不是完美的,但這僅是由於一些數據在編譯過程中丟失而導致的結果,並且反編譯器必須猜測程序的原始外觀。

您可以做很多事情。

您應該決定要精確執行的操作,然后獲得一個匹配的庫為您完成並學習該庫。

BCEL就是這樣一種圖書館。 過去,我已經成功地將Java-APT用於類似目的。

為了您的理解,我將在下面編寫一些有關生成類的內容,但是請不要自己開發,您很可能最終會陷入困境。

如果要讓您的類在當前正在運行的同一個JVM中可用(與之相反:您想生成代碼,然后再次編譯整個程序並重新啟動它),那么您必須:

  1. 創建文件,將您的字符串寫入其中。
  2. 編譯文件(一種粗略的方法是從代碼中調用javac)
  3. 將類加載到類加載器中。

暫無
暫無

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

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