Rhinoを試してみた。

ふと、Rhinoを使ってjavaインスタンス⇔テキストファイルを実現できんものかと考えた。
Java SE6 以降なら標準で使えるし。
後で聞いたところでは、直列化のカスタマイズが正しい方向らしい。そらそうだな。
他のやり方としては、JYamlを使えばYamlからクラスに戻せるらしい。
とはいえ、テキストファイル見ただけで内容が把握できるのは好み。
evalを使いたくなるあたりは、LLやshellの影響かな。

ポイントは、ScriptEngine#eval(String) と ScriptEngine#get(String)。
読み込み側は作ってみた。書き込み側も手間だができるだろう。

public class RhinoTest {
        private ScriptEngineManager factory;
        private ScriptEngine engine;

        public static void main(String[] args) throws Exception {
                RhinoTest test = new RhinoTest();
                test.prepareTest();
                test.doTest();
                test.doListTest();
        }
        void prepareTest() {
                factory = new ScriptEngineManager();
                engine = factory.getEngineByName("js");

        }
        void doTest() {
                try {
                        engine.eval("testString = new java.lang.String(\"Hello Rhino!\");");
                        NativeJavaObject njo = (NativeJavaObject) (engine.get("testString"));
                        System.out.println((String) njo.unwrap());
                } catch (ScriptException ex) {
                        ex.printStackTrace();
                }
        }

        void doListTest() throws Exception {
                StringBuffer sb = new StringBuffer();
                sb.append("importPackage(java.util);\n");
                sb.append("importPackage(java.lang);\n");
                sb.append("importPackage(net.irishapple);\n");
                sb.append("obj = new java.util.ArrayList();\n");
                sb.append("obj.add(new java.lang.String(\"Hello\"));\n");
                sb.append("obj.add(new java.lang.String(\"Rhino\"));\n");
                sb.append("obj.add(new java.lang.String(\"!\"));\n");
                sb.append("obj2 = new net.irishapple.TestClass();\n");
                sb.append("obj2.setS(\"Good night.\");\n");
                sb.append("obj2.setI(2);\n");
                sb.append("obj2.setB(true);");
                sb.append("obj2.addAl(\"item1\");");
                sb.append("obj2.addAl(\"item2\");");
                sb.append("obj2.addAl(\"item3\");");
                sb.append("obj2.addAl(\"item4\");");
                engine.eval(sb.toString());
                ArrayList list = (ArrayList) (engine.get("obj"));
                for (String s : list) {
                        System.out.println(s);
                }
                TestClass tc = (TestClass)(engine.get("obj2"));
                System.out.println(tc.getS());
                System.out.println(tc.isB());
                System.out.println(tc.getI());
                for (String s : tc.getAl()) {
                        System.out.println(s);
                }
        }
}
public class TestClass {

        String s;
        ArrayList al;
        int i;
        boolean b;

        public TestClass() {
                al = new ArrayList();
        }
        public String getS() {
                return s;
        }
        public void setS(String s) {
                this.s = s;
        }
        public int getI() {
                return i;
        }
        public void setI(int i) {
                this.i = i;
        }
        public boolean isB() {
                return b;
        }
        public void setB(boolean b) {
                this.b = b;
        }
        public void addAl(String s) {
                al.add(s);
        }
        public ArrayList getAl() {
                return al;
        }
}