我正在调试一个使用预编译 jar 的程序。我想记录对某个类中函数的调用。思路是将原类文件 Xxx.class 重命名为 Xxx0.class 并将原类名定义为:
class Xxx extends Xxx0 {
void func() {
Log.d(...);
super.func();
}
}
有任何想法吗?
(我确实尝试过反编译器:反编译代码中有奇怪的控制结构,反编译器可能不会为该程序生成正确的代码。)
我正在调试一个使用预编译 jar 的程序。我想记录对某个类中函数的调用。思路是将原类文件 Xxx.class 重命名为 Xxx0.class 并将原类名定义为:
class Xxx extends Xxx0 {
void func() {
Log.d(...);
super.func();
}
}
有任何想法吗?
(我确实尝试过反编译器:反编译代码中有奇怪的控制结构,反编译器可能不会为该程序生成正确的代码。)
不能只重命名一个类文件,因为不仅是类名在加载时用于计算类文件名,而且类名也存储在类文件中,而且必须匹配请求的课程。
因此,如果你想重命名一个类,你需要在源代码中这样做并重新编译。
我确实重命名了类文件,但这是一个漫长而无聊的故事。就我而言,这是一个 Android 应用程序,您可能需要将您的类转换为 Android 应用程序以重复我所做的 :)。顺序是:
apktool b -f AppName AppName.apk
~/Downloads/dex2jar-0.0.9.13/d2j-jar2dex.sh classes.jar
,得到 classes-dex2jar.jarclass Stuff extends Xtuff
),编译,得到新的 Stuff.class。(如果您现在可以调试,则可以开始调试并跳过以下步骤。)jarsigner -verbose -keystore ./my.keystore ./AppName.apk mykey
很明显,专用工具会使这个长序列更容易执行。
PS 当然,这种方法不适用于生产代码。
PPS 这不是一个通用案例:如果您的类包含静态工厂方法,则所需的修改变得更加棘手。
如果要重命名没有源 java 文件的类 ant,请执行以下步骤:
i) 首先在 jd(java 反编译器)中打开文件,然后保存(Ctrl+S)源文件。
ii)重命名java文件(F2)以及java文件中的类名。
iii) 再次将 java 文件(使用任何 java 编译器)编译为 .class 文件。
这将解决您的问题。
试试这个,如果有任何问题,请告诉我。
注意:如果您遇到 java 反编译器的问题,请尝试使用其他版本的 JD。
请访问这里下载最新的京东
Java 类文件不应随意重命名。当您这样做时,您编辑的类文件将由于错误而永远无法再次使用。这是因为类文件的名称对应于您的 java 类名称。
有了它,您需要做的就是在 Eclipse 中使用 .class 查看器,复制 .class 文件中显示的 java 代码。制作另一个 .java 文件并用您想要的文件名重命名类名。编译您的.java 文件并找到相应的.class。
现在,您已经成功重命名了 .class。
但是,也有缺点。只需确保将更改反映到其他受影响的类。
您无法更改 .class 文件的名称,因为它与 java 的公共类链接(相同)。仍然如果您更改了 .class 文件的名称,那么您还需要更改类的名称,否则会导致错误。
一旦编译完成(.java 到 .class),它就会转换为字节码,因此如果您更改了类文件的名称,您将无法直接更改字节码,但您可以使用反编译器(反射)再次将您的 .class 文件转换为 .java ),然后将公共类名更改为更改后的文件名,再次构建并使用它。
您可以获得许多可用的反编译器,它们可以轻松地将 .class 转换为 .java,并且 80% 相同。
这是面向方面编程的经典任务。例如,请参阅面向方面的 Android 开发 - 工具集成。