ProxyFactory.makeForwarder が実際に何をするかを理解するために、javassist プロキシを逆コンパイルしたいと思います。クラス バイトコードを CtClass から OutputStream に書き込むことは可能ですが、ProxyFactory.createClass() で開始する場合に CtClass を作成する方法がわかりません - Hibernate が javassist を使用する方法を模倣します。これが私が試したことです:
public void testProxyToDisk() throws Exception {
ProxyFactory f = new ProxyFactory();
f.setSuperclass(Product.class);
f.setFilter(new MethodFilter() {
public boolean isHandled(Method m) {
// ignore finalize()
return !m.getName().equals("finalize");
}
});
Class<?> proxyClass = f.createClass();
ClassPool classPool = ClassPool.getDefault();
ClassLoader classLoader = ProxyFactory.classLoaderProvider.get(f);
classPool.appendClassPath(new LoaderClassPath(classLoader));
CtClass ctClass = classPool.get(proxyClass.getName()); //barfs here
ctClass.debugWriteFile();
}
これが結果です。
javassist.NotFoundException: javassist.jassist_163.Product_$$_javassist_0 at javassist.ClassPool.get(ClassPool.java:450) at javassist.jassist_163.Find2MethodsPerfTest.testProxyToDisk(Find2MethodsPerfTest.java:36)
Test クラスと Product クラスは同じパッケージ (javassist.jassist_163) にあります。ありがとうございました。