美文网首页Android
再谈Android的包级作用域

再谈Android的包级作用域

作者: AndroidWorld | 来源:发表于2021-07-07 23:45 被阅读0次

背景

做Android的童鞋对Java里的几个作用域关键字肯定不陌生

public: 公开的,所有地方都可以访问

private: 私有的,只有当前类可以访问

protected: 继承的,当前类和子类可访问

default: 不包含任何作用域关键字,同一个包下可以访问

在这里想和大家讨论的就是这个default作用域,怎样才算同一个包下呢?

如何在包外访问default作用域的类或者方法

笔者写了一个简单的demo工程来验证这个问题,工程结构如下图

Demo工程结构

可以看到,这是一个标准的android工程结构,有app和test-lib两个module,app依赖test-lib。

test-lib下有两个类,代码如下,Test1类为public,但test2和test3方法是default作用域。Test2类为default,且test2方法也是default的。

Test1.java Test2.java

在app里的MainActivity里尝试访问这些default作用域的成员

访问default作用域的成员

可以看到IDE报错了,报错信息如下

IDE提示不能访问default作用域的方法

我们能访问这些default作用域的方法吗?有些童鞋可能会想到说用反射嘛,用反射确实可以访问。不用反射能做到吗?答案是可以的。我们在app module里建一个和Test1/Test2一样的包,如下图

在app module下建一个和test-lib一样的包

在这个包名下新建TestProxy类,可以看到在TestProxy里可以成功地访问default作用域修饰的方法和类。编译是没有问题了,能正常运行吗?修改代码如下

调用TestProxy方法

运行日志如下,可以看到也能成功运行。

运行成功

结论

是不是跟你理解的default作用域不太一样呢?所以在Android里default作用域的类或者方法在模块的包之下也是能够访问的,只需伪造一个和它一样的包名即可。笔者也尝试在Java里试了下,在Java里则会报错,如下图。都是用的java编译器,为啥现象不一样,有知道原因的同学欢迎留言告之^_^

Java里无法绕过default的限制

相关文章

  • 再谈Android的包级作用域

    背景 做Android的童鞋对Java里的几个作用域关键字肯定不陌生 public: 公开的,所有地方都可以访问p...

  • golang作用域总结

    作用域分为全局作用域、包级作用域和局部作用域 系统内置的类型、函数和常量属于全局作用域 命名函数只能在包级作用域中...

  • js闭包

    由于作用域的关系,函数之间不能相互读取变量,父级作用域不能读取子级作用域的变量。这是闭包出现了。 闭包 闭包就是能...

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • 2023-01-12

    变量提升调用栈块级作用域作用域链和闭包 闭包 => 作用域链(词法作用域) => 调用栈(栈溢出) => 上下文...

  • ES5的关键知识点

    闭包 闭包解决案例无块级作用域导致的一些错误。因为ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合...

  • 3-6 作用域和闭包--作用域-代码演示

    3-6 作用域和闭包--作用域-代码演示 知识点1、块级作用域

  • 闭包及获取内部方法

    闭包获取内部方法。 闭包的概念 作用域、作用域链(防止内存泄漏) 避免泄漏,写在匿名函数中,模仿块级作用域。这样匿...

  • 前端总结

    闭包以及应用场景 作用域作用域决定了代码区块中变量、函数、对象和其他资源的可见性全局作用域、函数作用域和块级作用域...

  • 第三题

    请写出如下点击li的输出值,并用多种方法正确输出li里的数字 闭包 块级作用域和函数级作用域,ES5没有块级作用域...

网友评论

    本文标题:再谈Android的包级作用域

    本文链接:https://www.haomeiwen.com/subject/troaultx.html