日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

easyopen的核心代碼非常簡單,底層是調(diào)用method.invoke()方法實現(xiàn)的。最精簡的代碼如下:

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;

}

}

// 業(yè)務(wù)類

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));

}

}

}

}

// 調(diào)用接口

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

// 根據(jù)方法名找到對應(yīng)的接口信息

ApiInfo apiInfo = map.get(name);

if (apiInfo == null) {

throw new IllegalAccessException("調(diào)用不存在的服務(wù)" + name);

}

Method method = apiInfo.method;

Object handler = apiInfo.handler;

return method.invoke(handler, param);

}

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

// 服務(wù)啟動

MiniEasyopen miniEasyopen = new MiniEasyopen();

// 注冊接口

miniEasyopen.regist();

// 請求名,請求參數(shù),假設(shè)已經(jīng)從request中解析出來

String name = "goods.get";

String param = "iphone";

// 方法調(diào)用

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

System.out.println("返回結(jié)果:" + result);

}

}

從main方法開始看,服務(wù)啟動做了注冊接口操作,即找到被@Api標記的方法,然后保存這個方法的信息。

調(diào)用接口時,根據(jù)接口名找到方法信息,然后invoke一下,返回結(jié)果。

這個最基本的骨架搭建完之后,可以進行一些額外則操作,比如簽名驗證、攔截器、方法結(jié)果處理操作。

easyopen就是在此基礎(chǔ)上逐漸完善起來的。

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的100行java电路程序_easyopen原理解析——不到100行代码实现一个最精简的easyopen的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。