我创建了一个泛型类,它以对象作为输入并实现一个方法,该方法给出该对象方法之一及其参数(即“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 导致它没有初始化方法。