繁体   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