go 语言中的 类注册 与 反射问题
程序员文章站
2022-03-03 11:49:00
...
go 语言中的 类注册 与 反射问题
go 语言中 并不能像java 一样直接通过 class.forname 的方式找到已经加载 classload 中的类, 为了像java web 一样 有一个dispactherservlet 并在调用的时候 反射到自己的方法上, 必须要实例化一个 controller 对象,获取该对象的类型
第一种方法
在 全局定义 Application 并写入主要放射类名 作为属性列表
注册 controller
type Application struct {
UserController UserController
PersonController PersonController
HealthController HealthController
}
注册 dispacther servlet 调用
type BlackHoleServlet struct {
}
func (BlackHoleServlet) DoReq(api string, obj *ReqObj.ReqObj) (string, bool) {
var ret string
var isTrue bool = false
serviceCode, _ := UrlUtil.GetServiceCode(api)
apiGroupCode, _ := UrlUtil.GetApiGroupCode(api)
apiCode, _ := UrlUtil.GetApiCode(api)
apiVersion, _ := UrlUtil.GetApiVersion(api)
fmt.Println(serviceCode, apiGroupCode, apiCode, apiVersion)
fmt.Println(obj)
requestMain := RequestMain.InitRequestMain(apiGroupCode, apiCode, apiVersion, obj)
fmt.Println("=========")
if !Params.IsSucc(requestMain.Params) {
//respObj := RespObj.RespObj{
// Resp: &RespObj.Response{Code: requestMain.Params.Code,Msg: requestMain.Params.Msg ,
// Subcode: requestMain.Params.Subcode ,Submsg: requestMain.Params.Submsg },Data: "",M0: nil}
respObj := RespObj.SetErrData(requestMain.Params.Code, requestMain.Params.Msg, requestMain.Params.Subcode, requestMain.Params.Submsg)
return RespObj.ToString(&respObj), false
}
var pool Application.Application
//获取结构体实例的反射类型对象
typeOfPool := reflect.TypeOf(pool)
fmt.Println(typeOfPool)
for i := 0; i < typeOfPool.NumField(); i++ {
fieldType := typeOfPool.Field(i)
fmt.Printf("name: %v tag: '%v'\n", fieldType.Name, fieldType.Tag)
}
fmt.Println("----", apiGroupCode)
//获取内部变量
typeController, ok := typeOfPool.FieldByName(apiGroupCode)
if !ok {
respObj := RespObj.SetErrData(Constants.RESPONSE_504_TXT, Constants.RESPONSE_504_TXT, Constants.RESPONSE_DETAIL_504_0001_CODE, Constants.RESPONSE_DETAIL_504_0001_TEXT+"[token]")
return RespObj.ToString(&respObj), false
}
mbp := requestMain.Params.BizParam
paramList := []reflect.Value{}
for _, valPro := range mbp {
paramList = append(paramList, reflect.ValueOf(valPro))
}
Try.Try(func() {
new := reflect.New(typeController.Type)
fmt.Println("=== new ===", (&new))
method1 := (&new).MethodByName(apiCode)
ret = method1.Call(paramList)[0].String()
isTrue = true
}).Catch("", func(e interface{}) {
respObj := RespObj.SetErrData(Constants.RESPONSE_505_TXT, Constants.RESPONSE_505_TXT, Constants.RESPONSE_DETAIL_505_0001_CODE, Constants.RESPONSE_DETAIL_505_0001_TEXT)
ret = RespObj.ToString(&respObj)
}).Finally(func() {
})
return ret, isTrue
}
第二种方法
在 设置一个类工厂池,
设置一个controller 对象池
package ApplicationPool
var Pool map[string] interface{} = make(map[string] interface{})
注册controller
package Controller
import (
"curiousby/Entity/RespObj"
"fmt"
"main/ApplicationPool"
)
func init() {
ApplicationPool.Pool["HealthController"] = HealthController{}
}
type HealthController struct {
}
注册 dispacther servlet 调用
func (WormholeServlet) DoReq(api string, obj *ReqObj.ReqObj) (string, bool) {
var ret string
var isTrue bool = false
serviceCode, _ := UrlUtil.GetServiceCode(api)
apiGroupCode, _ := UrlUtil.GetApiGroupCode(api)
apiCode, _ := UrlUtil.GetApiCode(api)
apiVersion, _ := UrlUtil.GetApiVersion(api)
fmt.Println(serviceCode, apiGroupCode, apiCode, apiVersion)
fmt.Println(obj)
requestMain := RequestMain.InitRequestMain(apiGroupCode, apiCode, apiVersion, obj)
fmt.Println("=========")
if !Params.IsSucc(requestMain.Params) {
respObj := RespObj.SetErrData(requestMain.Params.Code, requestMain.Params.Msg, requestMain.Params.Subcode, requestMain.Params.Submsg)
return RespObj.ToString(&respObj), false
}
typeController := ApplicationPool.Pool[apiGroupCode]
if typeController == nil {
respObj := RespObj.SetErrData(Constants.RESPONSE_504_TXT, Constants.RESPONSE_504_TXT, Constants.RESPONSE_DETAIL_504_0001_CODE, Constants.RESPONSE_DETAIL_504_0001_TEXT+"[token]")
return RespObj.ToString(&respObj), false
}
mbp := requestMain.Params.BizParam
paramList := []reflect.Value{}
for _, valPro := range mbp {
paramList = append(paramList, reflect.ValueOf(valPro))
}
Try.Try(func() {
t := reflect.TypeOf(typeController);
new := reflect.New(t)
fmt.Println("=== new ===", (&new))
method1 := (&new).MethodByName(apiCode)
ret = method1.Call(paramList)[0].String()
isTrue = true
}).Catch("", func(e interface{}) {
respObj := RespObj.SetErrData(Constants.RESPONSE_505_TXT, Constants.RESPONSE_505_TXT, Constants.RESPONSE_DETAIL_505_0001_CODE, Constants.RESPONSE_DETAIL_505_0001_TEXT)
ret = RespObj.ToString(&respObj)
}).Finally(func() {
})
return ret, isTrue
}
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!
上一篇: 正则表达式30分钟入门教程
下一篇: 泛型反射
推荐阅读