1 /* $Id: CalledMethod.java 94 2008-12-18 11:07:17Z dobashi $
\r
3 * (c)2004 Lavans Networks Inc. All Rights Reserved.
\r
5 package com.lavans.luz2.sql.cluster;
\r
7 import java.lang.reflect.InvocationTargetException;
\r
8 import java.lang.reflect.Method;
\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
26 // public CalledMethod(String methodName, Object[] args){
\r
27 // this.methodName = methodName;
\r
28 // this.args = args;
\r
33 * parameterType指定有り。
\r
36 * @param parameterTypes
\r
38 public CalledMethod(String methodName, Object[] args, Class<?>[] parameterTypes){
\r
39 this.methodName = methodName;
\r
41 this.parameterTypes = parameterTypes;
\r
48 * @throws NoSuchMethodException
\r
49 * @throws InvocationTargetException
\r
50 * @throws IllegalAccessException
\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
59 Method method = target.getClass().getMethod(methodName,parameterTypes);
\r
60 if(!method.isAccessible()){
\r
61 method.setAccessible(true);
\r
64 return method.invoke(target,args);
\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
82 if(contains(objectTypes, i)){
\r
83 parameterTypes[i] = Object.class;
\r
85 parameterTypes[i] = (Class<?>)args[i].getClass().getField("TYPE").get(null);
\r
87 }catch (Exception e) {
\r
88 //NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
\r
89 parameterTypes[i] = args[i].getClass();
\r
94 return parameterTypes;
\r
98 public String toString(){
\r
101 for(int i=0; i<args.length; i++){
\r
105 argStr += ","+ args[i].toString();
\r
108 if(argStr.length()>1){
\r
109 argStr = argStr.substring(1);
\r
112 return methodName +"("+ argStr +")";
\r
116 * intの配列の中にvalueがあるかどうか判定する。
\r
121 private boolean contains(int[] array, int value){
\r
122 if(array==null) return false;
\r
124 for(int i=0; i<array.length; i++){
\r
125 if(array[i]==value){
\r