1

我希望标题是可以理解的。

我有 4 个功能:

public void seta1(...);

public void seta2(...);

public void seta3(...);

public void seta4(...);

现在用户给了我一个带有方法部分名称(say String input = "a1")的字符串。有没有办法(不使用case选项)来激活正确的方法?

就像是 :(set+input)();

4

4 回答 4

3

假设您处理可能的异常,您可以使用 Java Reflection API:

Method method = obj.getClass().getMethod("set" + "a1");
method.invoke(obj, arg1,...);
于 2013-08-28T17:41:00.897 回答
2

Introspection就是为此目的而设计的(参见Introspector)。

//Here, I use Introspection to get the properties of the class.
PropertyDescriptor[] props = Introspector.getBeanInfo(YourClass.class).getPropertyDescriptors();

for(PropertyDescriptor p:props){
    //Among the properties, I want to get the one which name is a1.
    if(p.getName().equals("a1")){
        Method method  = p.getWriteMethod();
        //Now, you can execute the method by reflection.
    }
}

请注意,内省反思是两件不同的事情。

于 2013-08-28T17:40:30.880 回答
1

你可以使用反射:

public void invoke(final String suffix, final Object... args) throws Exception{
    getClass().getDeclaredMethod("set" + suffix, argTypes(args)).invoke(this, args);
}

private Class[] argTypes(final Object... args){
    final Class[] types = new Class[args.length];
    for(int i = 0; i < types.length; i++)
        types[i] = args[i].getClass();
    return types;
}
于 2013-08-28T17:40:42.383 回答
0

虽然有点奇怪,但可以通过反射来实现。试试 http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

于 2013-08-28T17:47:25.897 回答