4

Java で実際に Swizzle を実行できないことは承知しています。

私はいくつかの調査を行っていましたが、Java でリフレクションを実行して、Swizzle のような動作 (iOS で実行できる) を実現できる可能性があると思います。

犯人 (そして私が今まで見た中で最悪の設計上の決定の 1 つ) は、addView()すべての Android ViewGroup オブジェクトの関数です。親が null かどうかを明示的に確認する必要があります (必要な動作を得るために親をキャストする必要がある場合もあります!)。きもい。

addView()クライアントコードがこれを無視できるように、メソッドにこのチェックを自動的に実行させることで、(百万のサブクラスを作成せずに) これの動作を変更したいと考えています。

これはリフレクションでできることですか (私が理解していることから、ルートメソッド呼び出しを実際に変更するのではなく、特別なランタイム呼び出しが必要になるので [十分ではないかもしれません])、または何か他のものですか? それとも、間違った木を吠えていますか?

4

1 に答える 1

3

addViewあなたが言ったように、100万のサブクラスを作成しないと(または、実装をオーバーライドしたいクラスごとに1つのサブクラスを作成しないと)、これは不可能に思えます。これは実際には正しい方法であり、これらのサブクラスを XML レイアウト ファイルで使用できることも意味します。

リフレクションを使用すると、実行時にクラス/インターフェイス/フィールド/メソッドを検査できますが、コンパイルされた基になる実装によって提供される既に定義されている動作を変更することはできません。プライベート メソッド/フィールドにアクセスできるようにするなど、いくつかの変更は可能ですが。

灰色の領域のオプションが着信中...

検討する価値のある方向の 1 つはMockito、既存のオブジェクト インスタンスの周りにスパイを作成して、デフォルトの実装をオーバーライドできるようにすることです。これは、Java のプロキシInvocationHandlersによって実現されます。ただし、この時点で停止して、本番コードにテスト コードを含めるべきではなく、Mockito は明らかにそのためのものであると言います。少なくとも過去には、Views やContexts などの Android のクラスの一部にプロキシを配置することは (不可能ではないにしても) 困難であったことを考えると、なおさらです。これはDexMakerによって解決されたと思います、私自身の知識はあまりありませんが、ランタイムコード生成を実行できます. これは注目に値する別の方向性です。個人的には、これらのどちらも製品コードに値する可能な解決策として捉えるべきではなく、自分の好奇心のために遊んで学ぶべきものだと思います.

于 2015-07-17T19:14:31.053 に答える