[英]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.