首页 > 系统相关 >Android Java静态变量通信和反射的前提是须要在同一进程内

Android Java静态变量通信和反射的前提是须要在同一进程内

时间:2023-08-17 18:11:32浏览次数:27  
标签:WifiServiceImpl Java 变量 反射 静态 须要 WifiManager 进程 Android

静态变量通信:
java类中的static变量是属于类的,即使new了两个对象访问的也是同一个内存地址的static变量,也就是说可以通过static变量通信,但前提必须是这两个对象必须是同一个进程中的。

父进程通过fork来复制出一个子进程的副本,根据原理,子进程拥有父进程的一份完整数据拷贝。同时由于fork时按页复制数据太耗时,于是子进程在刚被fork出来的时候,读取的其实是父进程中的内存数据(所以,这时候也可以说静态变量是共享的)但是, 当父子进程中的一方对静态变量(其实不只是静态变量,任何内存中的东西都是这样)进行写入操作时,就会触发写时复制机制,这个变量将在子进程中产生一个新的空间来存放,于是变量不再共享,每个进程的内存空间都是属于它自己的。

 

反射:
java反射机制原理:我们写的源代码是.java文件,通过javac编译后成为.class文件,即字节码文件,程序执行时,JVM会类加载字节码文件到内存,严格意义上说是加载到方法区,并转换成java.lang.Class对象,通过反射,我们可以构建实例,得到成员变量的值,得到方法并调用。
比如 同样是//packages/modules/Wifi/目录下的类,android.net.wifi.WifiManager 可以被反射到,但 com.android.server.wifi.WifiServiceImpl 就无法被反射到。

因为WifiManager是可以通过WifiManager wifiManager = ((WifiManager) mContext.getSystemService(WIFI_SERVICE))在app端进程创建; 但WifiServiceImpl是系统服务,是在android系统启动时被system_server进程创建的对象,和pms、wms、ams等都属于同一个进程号。

 

举例:

在Android中想要跨进程通信也有一些方法比如共享内存、binder通信等等,像上面WifiManager的例子如果想在各个app进程之间进行通信,在WifiManager中增加静态变量或者对WifiManager实现单例模式或直接反射WifiServiceImpl里的静态变量是不行的,推荐使用aidl方式:

WifiManager.java              
IWifiManager.aidl              
BaseWifiService extends IWifiManager.Stub 
WifiServiceImpl extends BaseWifiService

如上结构,通过在WifiManager中实现接口访问WifiServiceImpl的普通变量,即可在多个进程各自生成的WifiManager对象调用接口访问系统进程中WifiServiceImpl对象的一般变量。

标签:WifiServiceImpl,Java,变量,反射,静态,须要,WifiManager,进程,Android
From: https://www.cnblogs.com/1118zjg/p/17638419.html

相关文章

  • 《Java编程思想第四版》学习笔记14
    //:Frog.java//TestingfinalizewithinheritanceclassDoBaseFinalization{publicstaticbooleanflag=false;}classCharacteristic{Strings;Characteristic(Stringc){s=c;out.println("Creating......
  • 《Java编程思想第四版》学习笔记15
    初始化的实际过程是这样的:(1)在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。(2)就象前面叙述的那样,调用基础类构建器。此时,被覆盖的draw()方法会得到调用(的确是在RoundGlyph构建器调用之前),此时会发现radius的值为0,这是由于步骤(1)造成的。(3)按照原先声明的......
  • 2023年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允许不同......
  • java stream分组之后求和
    javastream分组之后求和癞蛤蟆吃了小天鹅于2022-08-2609:37:42发布6023收藏4文章标签:java版权注:elementComponentDtos.stream().mapToDouble(ElementComponentDto::getAmount).sum();为求和可以根据返回类型的不同去改变相对应的求和函数(mapToDouble)注BigDecimal为了保......
  • 【狂神说Java】Java零基础学习笔记-JavaSE总结
    【狂神说Java】Java零基础学习笔记-JavaSE总结JavaSE总结:......
  • java:使用flexmark-java 实现 CommonMark(规范 0.28)解析
    文档https://github.com/vsch/flexmark-java依赖Java8<dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.62.2</version></dependency>Java9+&l......
  • Java踩坑1.Plugin org.apache.maven.plugins:maven-install-plugin:2.5 could not
    首次运行maveninstall或任何一个插件时,报错:Downloadingfromhuaweicloud:https://repo.huaweicloud.com/repository/maven/org/apache/maven/plugins/maven-install-plugin/2.5/maven-clean-plugin-2.5.pom[INFO]---------------------------------------------------------......
  • 【狂神说Java】Java零基础学习笔记-异常
    【狂神说Java】Java零基础学习笔记-异常异常01:Error和Exception什么是异常实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们......
  • javascript学习笔记day3
    今天没做啥笔记都是些学了的基础知识,学的都是像while,switch这些基础的语法,下面带是笔记++i前置运算和i++后置运算的区别:前置运行先相加再计算,后端运算先计算完再++。比较符也有隐式转换brank退出循环continue退出本次循环继续下次循环 顺便把while的循环作业一起放上来了,这个......
  • Android系统6~8需要适配的点
    一、概述Android系统每出一个大版本总有一些适配的点。这些适配点如果不适配就有可能会造成app闪退、功能不能用,app上架审核不通过的问题。写这一篇不为别的,就为了以后app出问题时能够提供一个解决问题的思路。参考:内容1,内容2二、适配总结Android6Android实在6......