OSDN Git Service

i
[luz/luz.git] / luz2 / src / com / lavans / luz2 / sql / cluster / CalledMethod.java
1 /* $Id: CalledMethod.java 94 2008-12-18 11:07:17Z dobashi $\r
2  * create: 2004/10/28\r
3  * (c)2004 Lavans Networks Inc. All Rights Reserved.\r
4  */\r
5 package com.lavans.luz2.sql.cluster;\r
6 \r
7 import java.lang.reflect.InvocationTargetException;\r
8 import java.lang.reflect.Method;\r
9 \r
10 /**\r
11  * @author dobashi\r
12  * @version 1.00\r
13  */\r
14 class CalledMethod {\r
15         private String methodName = null;\r
16         private Object[] args = null;\r
17         private Class<?>[] parameterTypes = null;\r
18         private int[] objectTypes = null;\r
19 \r
20         /**\r
21          * コンストラクタ。\r
22          * @deprecated\r
23          * @param methodName\r
24          * @param args\r
25          */\r
26 //      public CalledMethod(String methodName, Object[] args){\r
27 //              this.methodName = methodName;\r
28 //              this.args = args;\r
29 //      }\r
30 \r
31         /**\r
32          * コンストラクタ。\r
33          * parameterType指定有り。\r
34          * @param methodName\r
35          * @param args\r
36          * @param parameterTypes\r
37          */\r
38         public CalledMethod(String methodName, Object[] args, Class<?>[] parameterTypes){\r
39                 this.methodName = methodName;\r
40                 this.args = args;\r
41                 this.parameterTypes = parameterTypes;\r
42         }\r
43 \r
44         /**\r
45          * クラスタリングメソッド呼出処理。\r
46          * @param target\r
47          * @return\r
48          * @throws NoSuchMethodException\r
49          * @throws InvocationTargetException\r
50          * @throws IllegalAccessException\r
51          */\r
52         public Object invoke(Object target)\r
53                 throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {\r
54                 // すべてのclusterCall呼出にClass<?>[]を指定するまでの暫定処理\r
55                 if(parameterTypes==null){\r
56                         parameterTypes = getParameterTypes();\r
57                 }\r
58 \r
59                 Method method = target.getClass().getMethod(methodName,parameterTypes);\r
60                 if(!method.isAccessible()){\r
61                         method.setAccessible(true);\r
62                 }\r
63 \r
64                 return method.invoke(target,args);\r
65 \r
66         }\r
67 \r
68         /**\r
69          * class型設定。\r
70          * @return\r
71          */\r
72         private Class<?>[] getParameterTypes(){\r
73                 // getMethodに必要な引数の型の取り出し。\r
74                 Class<?>[] parameterTypes = null;\r
75                 if(args!=null){                                                         // 引数がnull(引数無し)じゃなければ\r
76                         parameterTypes = new Class[args.length];        // 引数の型を用意する。\r
77                         for(int i=0; i<args.length; i++){\r
78                                 // プリミティブ型の場合はラッパークラスで入っているので\r
79                                 // プリミティブ型のClassインスタンスを取り出す。\r
80                                 // 8typeについてそれぞれinstanceofで比較した方が速いか?要実験。\r
81                                 try{\r
82                                         if(contains(objectTypes, i)){\r
83                                                 parameterTypes[i] = Object.class;\r
84                                         }else{\r
85                                                 parameterTypes[i] = (Class<?>)args[i].getClass().getField("TYPE").get(null);\r
86                                         }\r
87                                 }catch (Exception e) {\r
88                                         //NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException\r
89                                         parameterTypes[i] = args[i].getClass();\r
90                                 }\r
91                         }\r
92                 }\r
93 \r
94                 return parameterTypes;\r
95         }\r
96 \r
97         @Override\r
98         public String toString(){\r
99                 String argStr = "";\r
100                 if(args!=null){\r
101                         for(int i=0; i<args.length; i++){\r
102                                 if(args[i]==null){\r
103                                         argStr += ",null";\r
104                                 }else{\r
105                                         argStr += ","+ args[i].toString();\r
106                                 }\r
107                         }\r
108                         if(argStr.length()>1){\r
109                                 argStr = argStr.substring(1);\r
110                         }\r
111                 }\r
112                 return methodName +"("+ argStr +")";\r
113         }\r
114 \r
115         /**\r
116          * intの配列の中にvalueがあるかどうか判定する。\r
117          * @param array\r
118          * @param value\r
119          * @return\r
120          */\r
121         private boolean contains(int[] array, int value){\r
122                 if(array==null) return false;\r
123 \r
124                 for(int i=0; i<array.length; i++){\r
125                         if(array[i]==value){\r
126                                 return true;\r
127                         }\r
128                 }\r
129                 return false;\r
130         }\r
131 }\r