[Jiemamy-notify:2786] commit [3710] InterfaceEnhancer+java.lang.reflect. Proxyのサンプルを動くようにした

Back to archive index

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




Jiemamy-notify メーリングリストの案内
Back to archive index