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()); ArrayListlist = (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; ArrayListal; 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; } }