我希望标题是可以理解的。
我有 4 个功能:
public void seta1(...);
public void seta2(...);
public void seta3(...);
public void seta4(...);
现在用户给了我一个带有方法部分名称(say String input = "a1"
)的字符串。有没有办法(不使用case
选项)来激活正确的方法?
就像是 :(set+input)();
我希望标题是可以理解的。
我有 4 个功能:
public void seta1(...);
public void seta2(...);
public void seta3(...);
public void seta4(...);
现在用户给了我一个带有方法部分名称(say String input = "a1"
)的字符串。有没有办法(不使用case
选项)来激活正确的方法?
就像是 :(set+input)();
假设您处理可能的异常,您可以使用 Java Reflection API:
Method method = obj.getClass().getMethod("set" + "a1");
method.invoke(obj, arg1,...);
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.
}
}
请注意,内省和反思是两件不同的事情。
你可以使用反射:
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;
}
虽然有点奇怪,但可以通过反射来实现。试试 http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html