原理是反射,获取类的所有方法,匹配调用的方法名字,调用方法。
public class CommandExecutor {
// 注解声明
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Command {
}
public class InvocationException extends Exception {
private static final long serialVersionUID = 7689802327736091185L;
public InvocationException(String detailMessage) {
super(detailMessage);
}
public InvocationException(Throwable throwable) {
super(throwable);
}
}
private Object mTargetObject;
private HashMap<String, Method> mExtraMethods;
public CommandExecutor(Object targetObject) {
mTargetObject = targetObject;
Method[] allMethods = mTargetObject.getClass().getMethods();
if (allMethods != null) {
mExtraMethods = new HashMap<String, Method>();
for (Method m : allMethods) {
if (m.isAnnotationPresent(CommandExecutor.Command.class)) {
if (mExtraMethods.containsKey(m.getName()))
throw new RuntimeException("find more than one command methods with the same name: "
+ m.getName());
mExtraMethods.put(m.getName(), m);
}
}
}
}
// 注解调用入口
public Object invoke(String methodName, Object... parameters) throws CommandExecutor.InvocationException, IllegalArgumentException,
InvocationTargetException {
Method m = mExtraMethods.get(methodName);
if (m == null)
throw new CommandExecutor.InvocationException(methodName + " not found");
try {
m.setAccessible(true);
return m.invoke(mTargetObject, parameters);
} catch (IllegalAccessException e) {
throw new CommandExecutor.InvocationException(e);
}
}
}