我有一个字符串:
String[] names = new String[] {"FirstMethod", "SecondMethod"...} //200 of these
目前我必须手动输入:
public void onSuccess( Map<String,ControlService.RegisterValues> result ) {
for( String Name : result.keySet() ){
message+=result.get(Name).FirstMethod+", ";
message+=result.get(Name).SecondMethod+", ";
//I call the method here - I'd like to use the list above to call it in though
显然我不想输入200次,有没有办法可以使用这个列表,将其转换为方法名称,并循环显示?
编辑:
我正在通过以下方式调用它:
public interface ControlService extends RemoteJsonService
{
public void I2CRegisterValues( String [] Names, AsyncCallback<Map<String,RegisterValues>> callback);
public class RegisterValues
{
int FirstMethod;
//etc.
答案 0 :(得分:1)
Class.getMethod(methodName).invoke(....);
有关详细信息,请参阅API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
答案 1 :(得分:1)
您可以使用Class.getMethod
访问方法,该方法返回Method
个对象。然后通过传递实例和参数来调用该Method
对象:
method.invoke(result.get(Name), whateverArguments);
关于您是否真正访问字段,您的问题有点含糊不清。如果是这种情况,您可以通过Field
获取Class.getField
,并通过get
方法获取其值,再次传入您要获取字段。
在任何一种情况下,结果都输入为Object
,您需要将其向下转换为预期类型。对于像int
这样的原语,返回的对象将是一个类似Integer
的盒装类型,您可以将其自动取消装箱到int
:
int foo = (Integer) method.invoke(...);
整个事情看起来像是:
Field field = I2CRegisterValues.getField(fieldName);
Object o = field.get(result.get(Name));
int fieldValue = (Integer) o;
...其中fieldName
是String
循环中的String[] names
变量。您也可以将上述内容作为一行:
int fieldValue = (Integer) I2CRegisterValues
.getField(fieldName)
.get(result.get(Name));
答案 2 :(得分:0)
//load desired Class at runtime
Class classObj = Class.forName("xyz.abc.YourClassName");
Object obj = classObj .newInstance();
//invoke specific method at runtime
for( String methodName : result.keySet() ){
Method method = cls.getDeclaredMethod(methodName , noparams);
method.invoke(obj, null);
}