オブジェクトを入力として取り、そのオブジェクトのメソッドとそのパラメーターの文字列表現 (つまり、"charAt(3)") を指定して解析し、検索してこするメソッドを実装するジェネリック クラスを作成しました。正しい方法。パラメータを持たないメソッドに対して実行することはできましたが、理解できない理由で、それらを取る他のいくつかのメソッド(文字列のcharAtなど)で失敗し続けます。これがコードです。
public class MiniInterpreter<T>
{
private Class<?> objClass;
private T object;
public MiniInterprete(T object)
{
objClass = object.getClass();
this.object = object;
}
private static boolean isNumeric(String str)
{
try
{
@SuppressWarnings("unused")
int i = Integer.parseInt(str);
}
catch(NumberFormatException nfe)
{
return false;
}
return true;
}
private static boolean isBoolean(String str)
{
return (str.equalsIgnoreCase("true") || str.equalsIgnoreCase("false"));
}
private static boolean isDouble(String str)
{
try
{
@SuppressWarnings("unused")
double d = Double.parseDouble(str);
}
catch(NumberFormatException nfe)
{
return false;
}
return true;
}
public String getName(int index, String str)
{
if(str.charAt(index) == '(' || str.charAt(index) == ')')
return "";
else
return str.charAt(index) + getName(index + 1, str);
}
public String getParameters(int index, String str)
{
switch(str.charAt(index))
{
case '(': return "" + getName(index + 1, str);
default: return getParametri(index + 1, str);
}
}
public Object parse(String method) throws GenericErrorException
{
String name = getName(0,method);
String parameters = getParameters(0,method);
if(!parameters.equals(""))
{
return parseParameters(name, parameters.split(","));
}
Method m = null;
try
{
m = objClass.getMethod(name);
}
catch (NoSuchMethodException e) {e.printStackTrace();}
catch (SecurityException e) {e.printStackTrace();}
try
{
return m.invoke(object);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {throw new GenericErrorException();}
}
private Object parseParameters(String name, String[] parameters) throws GenericErrorException
{
List<Class<?>> parametersList = new ArrayList<Class<?>>();
List<Object> parametersArray = new ArrayList<Object>();
for(String s : parameters)
{
Object obj = null;
if(isNumeric(s))
{
obj = Integer.parseInt(s);
}
else if(isDouble(s))
{
obj = Double.parseDouble(s);
}
else if(isBoolean(s))
{
obj = Boolean.parseBoolean(s);
}
else
obj = s;
parametersList.add(obj.getClass());
parametersArray.add(obj);
}
Method m = null;
Class<?>[] parametersTypeArray = parametersList.toArray(new Class<?>[parametersList.size()]);
try
{
m = objClass.getMethod(name, parametersTypeArray );
}
catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}
try
{
return m.invoke(object, parametersArray.toArray());
}
catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {throw new GenericErrorException();}
}
}
認められている唯一の型は、String、Integer、Boolean、および Double です。これは、メソッドが検索する場合にも当てはまります。また、その名前とパラメーターを持つメソッドが複数存在しないふりをする必要があります。この制限のためにコードが正しく機能しない場合は、何かを見落としていました。それが機能しない場合、noSuchMethod 例外が発生します。もちろん、nullPointer の例外により、メソッドが初期化されません。