Javassist: ClassPoolの親子関係とgetAndRename
package aop; import javassist.*; public class Javassist { public static void main(String[] args) throws Exception { ClassPool parent = new ClassPool(true); ClassPool child = new ClassPool(parent); getAndRename(child, "hoge1"); getAndRename(parent, "hoge2"); getAndRename(child, "hoge3"); child.appendSystemPath(); getAndRename(child, "hoge4"); } public static void getAndRename(ClassPool pool, String newName) { try { CtClass t = pool.getAndRename(InnerClass.class.getName(), newName); t.detach(); System.out.println("[SUCCESS]name='" + newName + "'"); } catch(Exception e) { System.out.println( "[FAILURE]name='" + newName + "', message='" + e.getMessage() + "'"); } } public static class InnerClass { } }
実行結果
[FAILURE]name='hoge1', message='javassist.NotFoundException: aop.Javassist$InnerClass' [SUCCESS]name='hoge2' [FAILURE]name='hoge3', message='javassist.NotFoundException: aop.Javassist$InnerClass' [SUCCESS]name='hoge4'
こういうもんなんだろうか。おかしいなあ。自身の検索パス探して見つからなかった場合は、親のClassPoolを見に行くとチュートリアルには書いてあったのだけれども。ちなみにgetAndRenameではなく、ただのgetなら大丈夫。もともとこういう動きが仕様どおりって事なんかいな? むーん。。