[英]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類生成。
您幾乎肯定會從嘗試以其他方式進行操作中受益,該方案可能失敗的方式數量之多令人擔憂。 這里有一些建議:
添加某種類型的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個,每個類派生一個。
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 }
合並類,而不是嘗試制作適配器。 可以通過以下操作輕松完成:
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反編譯器可供選擇,下面列出一些:
它們都不是完美的,但這僅是由於一些數據在編譯過程中丟失而導致的結果,並且反編譯器必須猜測程序的原始外觀。
您可以做很多事情。
您應該決定要精確執行的操作,然后獲得一個匹配的庫為您完成並學習該庫。
BCEL就是這樣一種圖書館。 過去,我已經成功地將Java-APT用於類似目的。
為了您的理解,我將在下面編寫一些有關生成類的內容,但是請不要自己開發,您很可能最終會陷入困境。
如果要讓您的類在當前正在運行的同一個JVM中可用(與之相反:您想生成代碼,然后再次編譯整個程序並重新啟動它),那么您必須:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.