-1

Java POJO クラスを動的に作成したい

以下は要件です:

パラメータ classname と map を受け取るメソッドがあります。マップキーはプリミティブ型になり、マップ値は変数になります

create Class(String ClassName, HashMap map) 
{
}

このメソッドが呼び出されると、指定された名前で .java ファイルが作成され、渡されたハッシュマップで POJO が作成され、ある場所に保存されます。

皆さん、これで私を助けてくれませんか。

私の質問を明確に提示できれば幸いです。

ありがとう。

4

2 に答える 2

0
public class MapFirst
{
    public static void createClass (
        String className, Map <Class<?>, String> fields) throws IOException
    {
        StringBuilder builder = new StringBuilder ();

        String packageName;
        int idx = className.lastIndexOf ('.');
        if (idx >= 0)
        {
            packageName = className.substring (0, idx);
            className = className.substring (idx + 1);
        }
        else packageName = null;

        if (packageName != null)
            builder.append ("package ").append (packageName).append (";\n");

        builder.append ("\n");

        builder.append ("public class ").append (className).append ("\n");

        builder.append ("{\n");

        boolean flag = false;
        for (Map.Entry <Class <?>, String> field: fields.entrySet ())
        {
            Class <?> type = field.getKey ();
            String name = field.getValue ();
            String nameCapitalized = Character.toUpperCase (name.charAt (0)) + name.substring (1);

            if (flag) builder.append ("\n");
            flag = true;
            builder.append ("    private ").append (type).append (" ").append (name).append (";\n");
            builder.append ("\n");
            builder.append ("    public ").append (type).append (" get").append (nameCapitalized).append (" ()\n");
            builder.append ("    {\n");
            builder.append ("        return ").append (name).append (";\n");
            builder.append ("    }\n");
            builder.append ("\n");
            builder.append ("    public void set").append (nameCapitalized).append (" (").append (type).append (" ").append (name).append (")\n");
            builder.append ("    {\n");
            builder.append ("        this.").append (name).append (" = ").append (name).append (";\n");
            builder.append ("    }\n");
        }

        builder.append ("}\n");

        File dir = new File (
            packageName.replaceAll (
                "\\.",
                Matcher.quoteReplacement (System.getProperty ("file.separator"))));

        dir.mkdirs ();

        BufferedWriter writer = new BufferedWriter (
            new OutputStreamWriter (
                new FileOutputStream (
                    new File (dir, className + ".java"))));

        writer.write (builder.toString ());
        writer.close ();
    }

    public static void main (String [] args) throws Exception
    {
        Map <Class <?>, String> fields = new HashMap <Class<?>, String> ();
        fields.put (int.class, "foo");
        fields.put (double.class, "bar");
        createClass ("my.pkg.MyClass", fields);
    }
}
于 2013-03-02T07:39:15.777 に答える
0

Java ソース コードを生成して.javaファイルに保存すると仮定すると、マップを反復処理して、必要に応じてフィールド定義とセッター/ゲッターを出力するだけです。

public String generateJava(String className, Map<String, Object> map) {
    StringBuffer b = new StringBuffer("public class ").append(className).append(" {\n");
    // first fields
    for (Entry<String, Object> field: map.entrySet()) {
       String name = field.getKey();
       String type = field.getValue().getClass().getName();
       b.append("\tprivate ").append(type).append(" ").append(name).append(";\n");
    }
    // then getters and setters
    for (Entry<String, Object> field: map.entrySet()) {
       String name = field.getKey();
       String type = field.getValue().getClass().getName();
       b.append("\n\n");
       // getter.   
       b.append("\tpublic ").append(type).append(" get").append(name.substring(0, 1).toUpperCase()).append(name.substring(1)).append("() {\n\t\t");
       b.append("return this.").append(name).append(";\n\t}"); 
       // setter.   
       b.append("\tpublic void").append(" set").append(name.substring(0, 1).toUpperCase()).append(name.substring(1)).append("(").append(type).append(" ").append(name).append(") {\n\t\t");
       b.append("this.").append(name).append(" = ").append(name).append(";\n\t}"); 
    }
    return b.append("\n}").toString();
}
于 2013-03-02T07:33:01.750 に答える