Tag: 字节码

如何在android中将方法调用注入到另一个方法中

我有一个class, 一个叫something的领域, 一个名为setSomething的setter方法, 一个叫做onChange的方法,每次改变时都应该调用它。 我希望能够自由地添加更多的领域,并为他们所有人都有相同的行为。 我不想手动调用onChange因为, 很多样板, 代码将被写入Kotlin,所以我不想编写setter函数。 我已经能够想到的理想解决方案是在编译时每个setter方法的return之前以某种方式注入onChange调用。 我已经看过注释处理,但是显然类并不是真的在那个阶段编译的,所以我不得不重新生成整个类。 我不完全明白这一点。 另一个选项似乎是编写一个gradle插件,它将find相关的类并修改它们的字节码。 实际上,我已经开始将它作为一个纯Java项目(gradle插件是半完成的),并且已经能够find类并注入方法调用。 虽然似乎无法成功地将结果写入类文件。 这是我的(使用BCEL ): public class StateStoreInjector { public static void main(String[] args) { // Find all classes that extends StateStore Reflections reflections = new Reflections(“tr.xip.statestore”); Set<Class> classes = reflections.getSubTypesOf(StateStore.class); for (Class c : classes) { try { JavaClass clazz = Repository.lookupClass(c.getName()); JavaClass […]

Kotlin为lambda生成内部类

在我的代码中,我有这样的东西: override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) presenter.onCreate() fabContainer.onClick { presenter.onLoginButtonClicked(…) } } 当我反编译apk和检查byteCode,这样的事情出现: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.presenter.onCreate(); Sdk23ListenersKt.onClick((ProgressFloatingActionButton) _$_findCachedViewById(com.prozis.prozisgo.prozisgo.R.id.fabContainer), new ActAuthLogin$onCreate$1(this)); } final class ActAuthLogin$onCreate$1 extends Lambda implements Function1 { final /* synthetic */ ActAuthLogin this$0; ActAuthLogin$onCreate$1(ActAuthLogin actAuthLogin) { this.this$0 = actAuthLogin; super(1); } public final void invoke(View it) { this.this$0.getPresenter().onLoginButtonClicked(StringsKt__StringsKt.trim(((EditText) […]

Kotlin Decompiler生成错误的代码 – 是否有可能防止?

class CheckInventory(target: Target) : Command(target) { } 使用IntelliJ的“ 显示Kotlin字节码 ”选项反编译上述Kotlin代码时,它会在super()调用之上继续生成一个语句: class CheckInventory extends Command { public CheckInventory(Target target) { Intrinsic.checkParameterIsNotNull(target, “target”); super(target); //error, must be first call } } 还有其他一些问题,如使用访问修饰符生成顶级类的时候: public class MyClass { } public final class MyClass$WhenMappings { //error, shouldn’t be public } 我检查了Kotlin和IntelliJ更新,我正在使用最新版本。 起初,我认为这可能与编写不好的Kotlin代码有关,但即使是最简单的代码文件似乎也需要某种在Java中非法的检查/生成。 题 有什么方法可以确保反编译过程保持在Java语言规则的范围之内吗?