easyopen的核心代码非常简单,底层是调用method.invoke()方法实现的。最精简的代码如下:

import java.lang.annotation.Documented;

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

import java.lang.reflect.Method;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import static java.lang.annotation.ElementType.METHOD;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**

* 迷你版easyopen

*

* @author tanghc

*/

public class MiniEasyopen {

@Documented

@Retention(RUNTIME)

@Target(METHOD)

@interface Api {

String name() default "";

}

static class ApiInfo {

private Object handler;

private Method method;

public ApiInfo(Object handler, Method method) {

this.handler = handler;

this.method = method;

}

}

// 业务类

static class GoodsService {

// 获取商品接口

@Api(name = "goods.get")

public String getGoods(String param) {

return "your param is " + param;

}

}

// 存放接口信息的地方

Map map = new ConcurrentHashMap();

// 注册接口

public void regist() {

// 找到bean对象,可以从spring容器中获取

Object[] beans = {new GoodsService()};

for (Object bean : beans) {

Class> serviceClass = bean.getClass();

Method[] methods = serviceClass.getMethods();

for (Method method : methods) {

// 找到注解方法

Api api = method.getAnnotation(Api.class);

if (api != null) {

System.out.println(String.format("【注册接口%s,%s】", api.name(), method.toString()));

map.put(api.name(), new ApiInfo(bean, method));

}

}

}

}

// 调用接口

public Object invoke(String name, String param) throws Exception {

// 根据方法名找到对应的接口信息

ApiInfo apiInfo = map.get(name);

if (apiInfo == null) {

throw new IllegalAccessException("调用不存在的服务" + name);

}

Method method = apiInfo.method;

Object handler = apiInfo.handler;

return method.invoke(handler, param);

}

public static void main(String[] args) throws Exception {

// 服务启动

MiniEasyopen miniEasyopen = new MiniEasyopen();

// 注册接口

miniEasyopen.regist();

// 请求名,请求参数,假设已经从request中解析出来

String name = "goods.get";

String param = "iphone";

// 方法调用

Object result = miniEasyopen.invoke(name, param);

System.out.println("返回结果:" + result);

}

}

从main方法开始看,服务启动做了注册接口操作,即找到被@Api标记的方法,然后保存这个方法的信息。

调用接口时,根据接口名找到方法信息,然后invoke一下,返回结果。

这个最基本的骨架搭建完之后,可以进行一些额外则操作,比如签名验证、拦截器、方法结果处理操作。

easyopen就是在此基础上逐渐完善起来的。

100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen相关推荐

  1. easyopen原理解析——不到100行代码实现一个最精简的easyopen

    2019独角兽企业重金招聘Python工程师标准>>> easyopen的核心代码非常简单,底层是调用method.invoke()方法实现的.最精简的代码如下: import ja ...

  2. 使用Eclipse创建Java应用程序,实现从控制台输出多行信息:姓名、年龄、爱好

    使用Eclipse创建Java应用程序,实现从控制台输出多行信息:姓名.年龄.爱好. package com.whx.demo; import java.util.Scanner; public cl ...

  3. 100+经典Java面试题及答案解析

    面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...

  4. java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...

    点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...

  5. java点击按钮结线程_多线程的Java应用程序在调试工具Netbeans中单击“停止”按钮时输出一个奇怪的结果...

    我使用wait()和notify()机制学习了java中的多线程. 但我很好奇输出一个简单的多线程Java应用程序. 代码如下: class Q { int n; boolean valueSet = ...

  6. python画爱心原理_如何理解python一行代码实现一个爱心字符画?

    前言 python中有个很酷的效果,一行代码实现一个爱心字符,虽说是一行代码,但是理解起来还是比较难的,括号太多,并且使用了python的一些快捷小技巧.比如三元表达式,列表生成式,字符串拼接以及一个 ...

  7. 【Java】Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  8. 项目解析jsx文件_Rax 转小程序链路原理解析(一)

    前言 随着 1.0 版本的发布,Rax 在小程序端的转换能力也得到了补齐.现在,你可以像过去开发 Web/Weex 端的应用一样使用 Rax 来进行小程序的开发.本系列文章将介绍 Rax 转小程序链路 ...

  9. Android”挂逼”修炼之行—防自动抢红包外挂原理解析

    一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...

最新文章

  1. “因人脸识别错误,我被捕了!”
  2. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  3. postman中设置关联点
  4. 文件系统ext3的文件大小限制
  5. JQuery文件上传控件Uploadify文档
  6. why2cs学习之路
  7. AlertDialog用法。
  8. php排斥ajaxsubmit函数,jQuery中的ajaxSubmit详解
  9. idea中XML注释与取消注释快捷键
  10. oracle中的varchar2存储中文,varchar2存储汉字
  11. 方差var、协方差cov、协方差矩阵(浅谈)
  12. ES文件浏览器曝严重漏洞,或影响数亿Android用户
  13. python 公开课_python公开课|可以用Python做的十件事,刚开始学python,你一定要知道...
  14. upstream指令参数 max_fails、fail_timeout、backup、max_conns、down
  15. Dell神州网信版 Win10 忘记登陆密码
  16. 给虚拟机添加虚拟磁盘时出现uuid already exists解决办法
  17. PCA(主成分分析)获取BoundingBox代码分析
  18. 720phi10p 和 720p有什么区别_很多人都在都使用视频采集卡,那视频采集卡有几种?有什么特点和区别?...
  19. 26个字母和数字符号ASCII码对照表
  20. 如何将PDF文档转成JPEG/JPG格式?

热门文章

  1. php jsonp实例 mip无限滚动组件接口注意事项
  2. double,float,BigDecimal类型数值的操作
  3. 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载【转】
  4. php的filesystem基本函数的学习(1)
  5. Android自动化测试之monkeyrunner基本要素(七)
  6. win7下安装redies
  7. Xcode编译Undefined symbols for architecture xxx 错误总结
  8. OpenSSL“心脏出血”漏洞爆发和修复方法
  9. 备忘录:CISCO router ENABLE crack
  10. 机器学习笔记(四)决策树