100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen
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相关推荐
- easyopen原理解析——不到100行代码实现一个最精简的easyopen
2019独角兽企业重金招聘Python工程师标准>>> easyopen的核心代码非常简单,底层是调用method.invoke()方法实现的.最精简的代码如下: import ja ...
- 使用Eclipse创建Java应用程序,实现从控制台输出多行信息:姓名、年龄、爱好
使用Eclipse创建Java应用程序,实现从控制台输出多行信息:姓名.年龄.爱好. package com.whx.demo; import java.util.Scanner; public cl ...
- 100+经典Java面试题及答案解析
面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...
- java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...
点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...
- java点击按钮结线程_多线程的Java应用程序在调试工具Netbeans中单击“停止”按钮时输出一个奇怪的结果...
我使用wait()和notify()机制学习了java中的多线程. 但我很好奇输出一个简单的多线程Java应用程序. 代码如下: class Q { int n; boolean valueSet = ...
- python画爱心原理_如何理解python一行代码实现一个爱心字符画?
前言 python中有个很酷的效果,一行代码实现一个爱心字符,虽说是一行代码,但是理解起来还是比较难的,括号太多,并且使用了python的一些快捷小技巧.比如三元表达式,列表生成式,字符串拼接以及一个 ...
- 【Java】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- 项目解析jsx文件_Rax 转小程序链路原理解析(一)
前言 随着 1.0 版本的发布,Rax 在小程序端的转换能力也得到了补齐.现在,你可以像过去开发 Web/Weex 端的应用一样使用 Rax 来进行小程序的开发.本系列文章将介绍 Rax 转小程序链路 ...
- Android”挂逼”修炼之行—防自动抢红包外挂原理解析
一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...
最新文章
- “因人脸识别错误,我被捕了!”
- autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
- postman中设置关联点
- 文件系统ext3的文件大小限制
- JQuery文件上传控件Uploadify文档
- why2cs学习之路
- AlertDialog用法。
- php排斥ajaxsubmit函数,jQuery中的ajaxSubmit详解
- idea中XML注释与取消注释快捷键
- oracle中的varchar2存储中文,varchar2存储汉字
- 方差var、协方差cov、协方差矩阵(浅谈)
- ES文件浏览器曝严重漏洞,或影响数亿Android用户
- python 公开课_python公开课|可以用Python做的十件事,刚开始学python,你一定要知道...
- upstream指令参数 max_fails、fail_timeout、backup、max_conns、down
- Dell神州网信版 Win10 忘记登陆密码
- 给虚拟机添加虚拟磁盘时出现uuid already exists解决办法
- PCA(主成分分析)获取BoundingBox代码分析
- 720phi10p 和 720p有什么区别_很多人都在都使用视频采集卡,那视频采集卡有几种?有什么特点和区别?...
- 26个字母和数字符号ASCII码对照表
- 如何将PDF文档转成JPEG/JPG格式?
热门文章
- php jsonp实例 mip无限滚动组件接口注意事项
- double,float,BigDecimal类型数值的操作
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载【转】
- php的filesystem基本函数的学习(1)
- Android自动化测试之monkeyrunner基本要素(七)
- win7下安装redies
- Xcode编译Undefined symbols for architecture xxx 错误总结
- OpenSSL“心脏出血”漏洞爆发和修复方法
- 备忘录:CISCO router ENABLE crack
- 机器学习笔记(四)决策树