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就是在此基礎上逐漸完善起來的。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中什么表示菜单项_下列类型中,表
- 下一篇: java怎么快速补缺_Java查漏补缺-