Используйте ImageIO.read()
вместо этого:
BufferedImage img = ImageIO.read(url);
Вы можете выполнить метод по имени через Reflection. Вам необходимо знать тип, а также имя метода (которое может быть типом текущего объекта, методом другого объекта или статическим типом). Похоже, вам нужно что-то вроде:
public void amethod(string functionName)
{
Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
method.Invoke(null,null); // Static methods, with no parameters
}
Изменить в ответ на комментарий:
Похоже, вы действительно хотите получить результат от этого метода. Если это так, учитывая, что это все еще статический метод службы (что я предполагаю, учитывая то, что вы написали), вы можете это сделать. MethodInfo.Invoke вернет возвращаемое значение метода как объект напрямую, поэтому, если, например, вы возвращали строку, вы могли бы сделать:
public string amethod(string functionName)
{
Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
object result = method.Invoke(null,null); // Static methods, with no parameters
if (result == null)
return string.Empty;
return result.ToString();
// Could also be return (int)result;, if it was an integer (boxed to an object), etc.
}
Выполнение строки, как если бы это был код, возможно в C #, но это непросто. Это' s также считается плохой практикой и небезопасным (вам, вероятно, следует избегать его и в динамических языках).
Вместо этого сделайте что-нибудь вроде этого:
public void amethod(Action actionParam)
{
actionParam();
}
Теперь в вашем случае вы хотите вызвать веб-службу. Поскольку в конечном итоге это сводится к xml, у вас есть пара вариантов:
Вы говорите, что AVeryLargeWebServiceWithLotsOfMethodsToCall
является экземпляром объекта, для которого вы хотите вызвать метод с именем functionName
? Если да:
MethodInfo method = AVeryLargeWebServiceWithLotsOfMethodsToCall.GetType().GetMethod(functionName);
method.Invoke(AVeryLargerWebServiceWithLotsOfMethodsToCall, null);
Или AVeryLargeWebServiceWithLotsOfMethodsToCall
тип, для которого вы хотите вызвать статический метод с именем functionName
? Если так:
MethodInfo method = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall).GetMethod(functionName);
method.Invoke(null, null);
Почему бы вам просто не использовать .NET Remoting? Он создан именно для этого.
Совершенно другим решением было бы использование класса CSharpCodeCompiler.
Это можно сделать с помощью отражения. Тем не менее, я считаю, что для этого вам нужна ссылка на объект.
Пример из здесь
Type t = this.GetType();
MethodInfo method = t.GetMethod("showMessage");
method.Invoke(this, null);
В качестве альтернативы вы можете использовать Action
или другой делегат для передачи ссылки на функцию, которую вы хотите вызвать.
public void amethod(Action function)
{
function();
}