首页 文章 精选 留言 我的

精选列表

搜索[反射调用],共10008篇文章
优秀的个人博客,低调大师

航天测控地面站中反射内存网的应用架构

航天测控地面站是航天器在轨运行期间与地面之间的纽带,承担着遥测数据接收、遥控指令上行、轨道测量与计算、时间统一、态势显示等核心任务。以统一S波段(USB)测控体制为例,地面站通常由天线伺服系统、基带中频采集与调制设备、遥测处理终端、遥控终端、轨道计算计算机、时统设备以及多屏显示终端组成。这些设备在任务弧段内需要以微秒甚至亚毫秒级的时间节拍协同工作:遥测帧从中频解调后需要立即分发到轨道计算单元和显示终端,遥控指令从指挥员敲击键盘到发射机调制成上行射频信号,其端到端延迟必须严格可控;时统设备输出的秒脉冲和绝对时间戳则需要在所有节点上以纳秒级偏差对齐。

优秀的个人博客,低调大师

Go 语言反射和范型在 API 服务中的应用

Go reflect 为何需要使用 reflect 获取:减少重复代码 1. API 接口中抽取参数的逻辑大量重复 API 接口自然是要获取传过来的数据,不同接口要获取的数据自然也不一样,如果不做特殊处理,必然是每个接口都有一堆功能重复的从 request 里获取参数的代码。 2. API 框架提供的抽取参数的方式并不满足需求 当然 API 框架会提供这些功能,不过有些情况不能满足需求,比如gin-gonic,提供了将将 request 转为对应结构体的函数,但存在两个问题,第一个问题是参数区分大小写,我觉得应该实现大小写的通配,这样健壮性更高;第二是结构体直接对应数据库表结构,部分数据是不应该从接口请求中读取的,比如创建时间和删除标志,全转换的方式就很有问题。 不过也有可能是因为我对 gin 不熟悉,不知道更好的用法,才自己造轮子,如果大家有更简洁漂亮的写法,请不吝赐教。 3. Golang 强类型语言的限制 Go 语言是强类型语言,函数间传递参数或者返回值,必须有特定的类型,如果要实现这种范类型的处理相对 Python 等弱类型的语言要困难一些。 Python 对于 struct 参数没有严格的限制,传什么内容都行,Golang 就没那么友好了,这部分要靠范型来处理。 # struct 是要获得的数据结果,params 是要抽取的参数名称数组,request 是接口的请求结构体。 def ExtractParamFromBody(struct, params, request): ... 还有一点就是要能获取到 struct 结构体中每个参数的类型,并且给其赋值,Golang 提供的 reflect 机制可以很好的完成这项功能。 4. 实例 以下代码先是建立了数据库连接(请注意,数据的连接需要提前建立好,并按照代码中的用户名、密码、地址、端口和数据库名称建立,不然代码无法运行成功);之后在数据库中建立了一个叫 User 的表;之后有一个创建用户的接口 "POST /users",对应的函数为 CreateUser。 ExtractParamFromBody 是通用的参数抽取函数,不光是 User 类型,interface{} 是 Golang 中范型,可以对应任何结构体。 package main import ( "fmt" "reflect" "strconv" "strings" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" ) type User struct { ID uint `json:"id" gorm:"PRIMARY_KEY;AUTO_INCREMENT"` Name string `json:"name" gorm:"INDEX:name;UNIQUE;NOT NULL;type:varchar(100)"` Password string `json:"password" gorm:"NOT NULL"` Mobile string `json:"mobile"` Email string `json:"email"` Role_id uint `json:"role_id"` Create_Time uint `json:"create_time"` Login_Time uint `json:"login_time"` Last_Login_Time uint `json:"last_login_time` Login_Count uint `json:"login_count"` Deleted bool `json:"deleted" gorm:"DEFAULT:0"` } var db *gorm.DB var err error func ExtractParamFromBody(s interface{}, params []string, c *gin.Context) { var typ reflect.Type var val reflect.Value ptyp := reflect.TypeOf(s) if ptyp.Kind() == reflect.Ptr { val = reflect.ValueOf(s).Elem() typ = reflect.TypeOf(s).Elem() } else { val = reflect.ValueOf(s) } for _, param := range params { ret := c.PostForm(param) if ret != "" { for i := 0; i < typ.NumField(); i++ { if strings.ToLower(typ.Field(i).Name) == param { if val.Field(i).Kind() == reflect.String && val.CanSet() { val.Field(i).SetString(ret) } else if val.Field(i).Kind() == reflect.Uint && val.CanSet() { ret_int, _ := strconv.Atoi(ret) val.Field(i).SetUint(uint64(ret_int)) } } } } } } func InitMysql() *gorm.DB { mysql_connection_string := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", "root", "mysql", "127.0.0.1", "3306", "test_db") db, err = gorm.Open("mysql", mysql_connection_string) if err != nil { log.Logger.Critical("Fail to connect MySQL: %s. Exit.", err) os.Exit(5) } db.AutoMigrate(&User{}) return db } func CreateUser(c *gin.Context) { var user mysql.User params := []string{"name", "password", "email", "mobile", "role_id"} ExtractParamFromBody(&user, params, c) if err := db.Create(&user).Error; err != nil { c.JSON(200, gin.H{ "code": 3, "result": "failed", "msg": "Fail to create user", }) } else { c.JSON(200, gin.H{ "code": 0, "result": "success", "msg": "success", "resultBean": user, }) } } func main() { InitMysql() r := gin.Default() r.POST("/v1/users", CreateUser) r.Run(":8080") }

优秀的个人博客,低调大师

利用java反射机制,使用android系统的内部类成员函数

//访问某个属性 Context mmsCtx = createPackageContext( "com.android.lockscreen" , Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); Class<?> maClass = Class.forName( "com.android.lockscreen.LockScreenActivity" , true , mmsCtx.getClassLoader()); Object maObject = maClass.newInstance(); Field f_mPm = maClass.getDeclaredField( "TAG" ); f_mPm.setAccessible( true ); Log.i(LOG_TAG, "___________________________________________obj:" +f_mPm.get(maObject)); //访问方法 //访问 try { Context mmsCtx = createPackageContext( "com.android.lockscreen" , Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); Class<?> maClass = Class.forName( "com.android.lockscreen.LockScreenActivity" , true , mmsCtx.getClassLoader()); Object maObject = maClass.newInstance(); Field f_mPm = maClass.getDeclaredField( "TAG" ); //maClass.getDeclaredMethod("", parameterTypes); f_mPm.setAccessible( true ); Log.i(LOG_TAG, "___________________________________________obj:" +f_mPm.get(maObject)); Class[] resource = new Class[]{Context. class }; Object[] resourceObj = new Object[]{mmsCtx}; Method addsMethod = maClass.getDeclaredMethod( "getLockScreenView" , resource); addsMethod.setAccessible( true ); View addsResult = (View)addsMethod.invoke(maObject, resourceObj); Log.i(LOG_TAG, "___________________________________________addsResult:" +addsResult); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //定义被访问 public class LockScreenActivity extends Activity { private String TAG = "LockScreenActivity" ; //private LockScreen mScreen = new LockScreen(LockScreenActivity.this); private LockScreen getLockScreenView(Context context){ Log.i(TAG, "_________________________________________context:" +context); return new LockScreen(context); } } //获取setting包的的Context Context mmsCtx = createPackageContext( "com.android.settings" , Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); //使用setting的classloader加载com.android.settings.ManageApplications类 Class<?> maClass = Class.forName( "com.android.settings.ManageApplications" , true , mmsCtx.getClassLoader()); //创建它的一个对象 Object maObject = maClass.newInstance(); /* * 将私有域mPm赋值。因为mPm在SizeObserver的invokeGetSize中用到了, * 却因为没有执行onCreate而没有初始化,所以要在此处初始化。 */ Field f_mPm = maClass.getDeclaredField( "mPm" ); f_mPm.setAccessible( true ); f_mPm.set(maObject, mmsCtx.getPackageManager()); 分类: android solve 本文转自wanqi博客园博客,原文链接http://www.cnblogs.com/wanqieddy/archive/2011/10/25/2224200.html :如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册