通过注解结构化代码

原理是反射,获取类的所有方法,匹配调用的方法名字,调用方法。

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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值