java - 打印源文件的当前内容(在 Android 上使用 Java 或 Kotlin)
问题描述
假设我们有 Android 应用程序,从文件 A、B、C 编译。我想在屏幕上打印文件 A 的源代码,如果将来我会对文件进行一些更改,AI 想打印这个文件的新状态。假设允许从文件 B 或 C 打印(文件 A 不必自己打印)。 最直接的方法是什么?
提示。 根据我的研究,我认为 gradle 任务是可能的,它在编译之前将复制文件从 src/main/java 填充到资产中。我们可以以“标准”方式从资产中读取这些文件。但这对我来说听起来像是一种解决方法。我不想在我的应用程序中有重复的 java/kotlin 文件。如果我在 src/main/java 下有 A、B、C 类,我想在没有这些操作的情况下从 B 类打印例如 A 类的源代码。
解决方案
那么为什么要这样我们不能打印带有所有函数和变量等的整个类呢?
简单的答案:因为程序不需要运行,因此被编译器剥离,甚至更多地被proguard等工具剥离。因此,在运行时,您想要访问的代码(您想要明文的代码)甚至可能不在生成的 .aar 中。
Java 被编译为类文件中的字节码,您可以通过某种方式读取其中的所有内容。
根据我的研究,我认为 gradle 任务是可能的,它在编译之前将复制文件从 src/main/java 填充到资产中。我们可以以“标准”方式从资产中读取这些文件。但这对我来说听起来像是一种解决方法。我不想在我的应用程序中有重复的 java/kotlin 文件。如果我在 src/main/java 下有 A、B、C 类,我想在没有这些操作的情况下从 B 类打印例如 A 类的源代码。
这不是解决方法。您想在程序中保留编译程序所需的信息,然后您必须自己保留(即在.zip 文件或sources.jar 中)。
我们可以很容易地打印例如示例中的类名,例如 tutorialspoint.com/java/lang/class_getsimplename.htm
这是因为该信息对于实例化公共类是必需的,即通过依赖注入。
推荐阅读
- android - 片段/Kotin 中的数据绑定
- javascript - 使用 nodejs 服务器和 Pug 如何一次显示列表中的元素并使用按钮进行迭代?
- reactjs - React 应用程序无法在 IE 11 浏览器中运行
- angular - 防止点击另一个按钮,直到它停止
- binary - 如何使用差异和补丁来比较两个 pcap 文件?
- python - 在熊猫 to_datetime 函数中处理时区
- c# - 无法从 Nuget 包管理器安装 Microsoft.EntityFrameworkCore
- javascript - HTML如何防止在画布元素上拖动时意外选择页面?
- angular - 致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足 #34576
- python-3.x - 如何通过蓝牙在 Raspberry Pi 4 和 Arduino Nano BLE 之间进行读写?