java - 如何通过一个实例方法访问当前活动中的所有成员和方法?
问题描述
你好堆栈溢出社区。我目前正在开发一个使用 WebRTC 的 Android VoIP 应用程序,因此我一直在尝试理解我在GitHub 上找到的源代码。到目前为止,我已经能够重现和理解我找到的一些源代码,但目前我偶然发现了SignalingClient实现的问题。为了进一步理解我的问题,我认为更详细并更准确地提出问题是合适的:
如何通过一个实例方法访问当前活动中的所有成员,而不从类中声明它的对象,该实例方法定义在同一个班级?
我认为在源代码中指出它也有助于理解这个问题。我已经缩短了代码,因此它尽可能接近问题。
class SignallingClient {
private static SignallingClient instance;
private String roomName = null;
private Socket socket;
boolean isChannelReady = false;
boolean isInitiator = false;
boolean isStarted = false;
private SignalingInterface callback;
...
public static SignallingClient getInstance() {
if (instance == null) {
instance = new SignallingClient();
}
if (instance.roomName == null) {
//set the room name here
instance.roomName = "vivek17";
}
return instance;
}
public void init(SignalingInterface signalingInterface) {
...
}
...
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SignallingClient.SignalingInterface {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}, ALL_PERMISSIONS_CODE);
} else {
// all permissions already granted
start();
}
}
...
public void start() {
// keep screen on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initViews();
initVideos();
getIceServers();
SignallingClient.getInstance().init(this); //Here is my lack of understanding/reproducing/comprehending,
//because at this point I have access to all members(variables)
//in the SignalingClient.java class : boolean isChannelReady,
//boolean isInitiator, boolean isStarted
//and also other methods which are public...
//Shouldnt it be like this?
/*
SignalingClient obj = new SignalingClient();
obj.getInstance();
obj.init(this);
*/
...
}
...
}
在尝试并在网络上查找[1] [2] [3] [4]和许多其他相关的 stackoverflow 问题之后,我注意到根据这些来源[5] [6],这种行为与静态修饰符有关[7]而且还有一个事实是
class SignallingClient{... //SignallingClient
private static SignallingClient instance;... //SignallingClient
public static SignallingClient getInstance() {... //SignallingClient
正如我们在上面的注释行中看到的那样,类、实例成员以及 getInstance 方法都具有/共享相同的“名称” 。回到我的问题,我真的很想知道它是如何工作的,或者这是否是在不声明对象的情况下访问所有可能的成员和方法(以及其他我还不知道的东西)的技巧。我真的很感激任何答案,然后是对该主题的一个很好的解释,以及删除一些好的资源/教程/大学脚本等,我可以在这些地方阅读。非常感谢。
解决方案
推荐阅读
- mysql - 如何使用 JOIN 和多个排序条件创建 MySQL 5.6 Rank
- javascript - 用于将 .csv 转换为 .html 并处理多个文件的 Powershell 脚本
- dynamics-business-central - 如何在 AL 中发送获取请求
- python - 在 Python 中导入 EmguCV 失败
- pandas - 关于从 TK 表单插入到 csv 文件的问题
- c# - 自动序列化类属性及其类型
- azure - 连接尝试失败,因为连接方在 azure 通知中心一段时间后没有正确响应
- django - Django 如何根据输入选择不同的表?
- javascript - columnDefinitions 中定义的 cellClass 属性不起作用
- sql - Select * from Table 和 Select count(*) from Table 中的行数之间的差异?