svnno****@sourc*****
svnno****@sourc*****
2009年 10月 6日 (火) 10:14:18 JST
Revision: 3710 http://sourceforge.jp/projects/jiemamy/svn/view?view=rev&revision=3710 Author: ashigeru Date: 2009-10-06 10:14:18 +0900 (Tue, 06 Oct 2009) Log Message: ----------- InterfaceEnhancer+java.lang.reflect.Proxyのサンプルを動くようにした Modified Paths: -------------- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/EnhanceManipulator.java leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/NewInstanceEnhancer.java leto/factory-enhancer-example/branches/interface-enhancer/src/main/java/org/jiemamy/util/enhancer/example/_10proxy/Main.java Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/EnhanceManipulator.java =================================================================== --- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/EnhanceManipulator.java 2009-10-06 00:53:46 UTC (rev 3709) +++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/EnhanceManipulator.java 2009-10-06 01:14:18 UTC (rev 3710) @@ -733,25 +733,40 @@ * {@link #createAdviceTableField(CtClass)}によって作成されるフィールドに含まれている。 * </p> * @param target フックする対象のインスタンス生成式 + * @param resultType 生成するインスタンス型の上限境界 + * (本来実行するインスタンス生成式に対して、拡張前のプログラムが要求する型がインスタンス型のスーパータイプである可能性がある) * @param holder アドバイスを保持するフィールド * @param index 拡張番号 * @throws CannotCompileException コンパイルに失敗した場合 * @throws NullPointerException 引数に{@code null}が指定された場合 + * @since 0.2.0 */ - public static void replaceToPointcut(NewExpr target, CtField holder, int index) throws CannotCompileException { + public static void replaceToPointcut( + NewExpr target, + CtClass resultType, + CtField holder, + int index) throws CannotCompileException { if (target == null) { throw new NullPointerException("target is null"); //$NON-NLS-1$ } + if (resultType == null) { + throw new NullPointerException("resultType is null"); //$NON-NLS-1$ + } if (holder == null) { throw new NullPointerException("holder is null"); //$NON-NLS-1$ } CtBehavior contextBehaviour = target.where(); if (isStatic(contextBehaviour)) { - target.replace(String.format("$_ = ($r) %s[%d].invoke(%s, $args);", //$NON-NLS-1$ - holder.getName(), index, contextBehaviour.getDeclaringClass().getName() + ".class")); //$NON-NLS-1$ + target.replace(String.format("$_ = (%s) %s[%d].invoke(%s, $args);", //$NON-NLS-1$ + resultType.getName(), + holder.getName(), + index, + contextBehaviour.getDeclaringClass().getName() + ".class")); //$NON-NLS-1$ } else { - target.replace(String.format("$_ = ($r) %s[%d].invoke(this, $args);", //$NON-NLS-1$ - holder.getName(), index)); + target.replace(String.format("$_ = (%s) %s[%d].invoke(this, $args);", //$NON-NLS-1$ + resultType.getName(), + holder.getName(), + index)); } } Modified: leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/NewInstanceEnhancer.java =================================================================== --- leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/NewInstanceEnhancer.java 2009-10-06 00:53:46 UTC (rev 3709) +++ leto/factory-enhancer/branches/interface-enhancer/src/main/java/org/jiemamy/utils/enhancer/helper/NewInstanceEnhancer.java 2009-10-06 01:14:18 UTC (rev 3710) @@ -189,7 +189,7 @@ }); // new Hoge(...)の部分を、アドバイスの実行に置き換える - EnhanceManipulator.replaceToPointcut(expr, holder, enhanceIndex); + EnhanceManipulator.replaceToPointcut(expr, provider, holder, enhanceIndex); if (productEnhanceMap.containsKey(provider)) { // newする対象のクラス自体がエンハンスされて別クラスになっている場合、 Modified: leto/factory-enhancer-example/branches/interface-enhancer/src/main/java/org/jiemamy/util/enhancer/example/_10proxy/Main.java =================================================================== --- leto/factory-enhancer-example/branches/interface-enhancer/src/main/java/org/jiemamy/util/enhancer/example/_10proxy/Main.java 2009-10-06 00:53:46 UTC (rev 3709) +++ leto/factory-enhancer-example/branches/interface-enhancer/src/main/java/org/jiemamy/util/enhancer/example/_10proxy/Main.java 2009-10-06 01:14:18 UTC (rev 3710) @@ -18,6 +18,7 @@ import java.lang.reflect.Method; import java.util.Arrays; import java.util.Properties; +import java.util.concurrent.Callable; import org.jiemamy.utils.enhancer.Enhance; import org.jiemamy.utils.enhancer.Enhancer; @@ -39,23 +40,34 @@ Enhancer<ExecutableFactory> enhancer = new InterfaceEnhancer<ExecutableFactory>( ExecutableFactory.class, Properties.class, // Propertiesを実装するようにする - Arrays.<Enhance>asList( - // Daoの実装を生成する際に、 DaoFactory.newInstanceの引数でうまい具合に初期化 - ProxyDriver.newEnhane(Runnable.class, new java.lang.reflect.InvocationHandler() { - public Object invoke(Object proxy, Method method, Object[] a) { - System.out.printf("Hook %s%n", method); - return null; - } - }) - ) + Arrays.asList(new Enhance[] { + // Runnableのインスタンス生成の代わりに、Proxyを返す + ProxyDriver.newEnhane(Runnable.class, new java.lang.reflect.InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] a) { + System.out.printf("Hook %s%n", method); + return null; + } + }), + // Callableのインスタンス生成の代わりに、Proxyを返す + ProxyDriver.newEnhane(Callable.class, new java.lang.reflect.InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] a) { + System.out.printf("Hook %s%n", method); + return "Hello"; + } + }), + }) ); System.out.println("ファクトリを生成"); ExecutableFactory factory = enhancer.getFactory().newInstance(); System.out.println("プロダクトを生成"); Runnable runnable = factory.newRunnable(); + Callable<String> callable = factory.newCallable(); System.out.println("run()メソッドの呼び出し"); runnable.run(); + + System.out.println("call()メソッドの呼び出し"); + System.out.printf("callable.call() = \"%s\"%n", callable.call()); } }