欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go 语言中的 类注册 与 反射问题 博客分类: go goregisterreflect反射注册 

程序员文章站 2024-03-12 10:47:38
...

 

 

 

 

 

 

 

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/


go 语言中的 类注册 与 反射问题
            
    
    博客分类: go goregisterreflect反射注册 go 语言中的 类注册 与 反射问题
            
    
    博客分类: go goregisterreflect反射注册 go 语言中的 类注册 与 反射问题
            
    
    博客分类: go goregisterreflect反射注册 
 
 
 谢谢您的赞助,我会做的更好!