問題タブ [byte-buddy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 実行時にクラスのスーパークラスを変更する
Byte Buddy を使用して、抽象クラスから継承することにより、実行時にクラスを拡張できますか?
Organization
以下のような抽象クラスから継承することで、すべてのインスタンスをインターセプトして強化できるはずです。
java - sun.reflect.GeneratedMethodAccessor1 を再定義しようとすると ByteBuddy が失敗する
好奇心に駆られて、GeneratedMethodAccessor1 (リフレクションの使用時に JVM によって生成された) のバイトコードをエクスポートしようとしました。
次の方法でクラスのバイトコードを取得しようとします。
ただし、このクラスを実行すると、次のエラーが発生します。
基本的には、最初に JVM がメソッドを拡張する (GeneratedMethodAccessor を生成する) のに十分な回数だけメソッド呼び出しを繰り返し、次にバイトコードを取得するためにクラスを再定義しようとします。
生成されたプロキシ クラスをエクスポートするために同じ方法を試しましたが、問題なく動作しました。それが私がこれを試すようになった理由です。
GeneratedMethodAccessor1 クラスの DelegatingClassLoader は、loadClass メソッドでクラスをロードしようとすると、クラスをリロードすることさえできないようです。
GeneratedMethodAccessor クラスのバイトコードを取得する方法はありますか?
java - Byte Buddy を使用してカスタム メソッド シグネチャを効率的に作成する方法
ByteBuddy でプロファイラーを実装しようとしています。私は現在、プロファイリングしているメソッドの適切な署名を効率的に作成することに苦労しています。
これが私の現在の実装の要点です: https://gist.github.com/felixbarny/e0c64819c59368a28200
ProfilingInterceptor.profile メソッドには 2 つの実装があります。それぞれに独自の欠陥があります。
最初のものは@Origin String signature
署名として使用します。ByteBuddy がそれをキャッシュしているように見えるので、これは非常に効率的です。問題は、署名の形式に満足できないことです。たとえばmethod2(I)I
。
@Origin(cacheMethod = true) Method method
2 番目の実装では、見栄えの良い署名を注入して手動で構築していますint org.stagemonitor.benchmark.profiler.ClassJavassistProfiled.method2(int)
。明らかな問題は、すべての呼び出しで署名が再作成されることです-パフォーマンスが向上しません(私のjmhベンチマークは、4倍遅いと言っています)。
たとえば、署名ごとに文字列定数を作成することにより、署名をキャッシュする方法はありますか?
前もって感謝します
java - byte buddy メソッド委任を、注釈付きパラメーターを持つメソッドにのみバインドする
メソッド呼び出しが自動的に検証されるように、既存のオブジェクトを装飾したいと考えています。Hibernate バリデーターを呼び出すインターセプターにメソッド呼び出しを委譲することができましたが、これまでのところ正常に動作しています。
私が改善したいのは、メソッド呼び出しを、次のような制約注釈で注釈が付けられたパラメーターを少なくとも 1 つ持つメソッドにのみバインドすることです。
Byte Buddy で ElementMatcher を指定して、@NotNull (javax.validation.constraints から取得) などの @Constraint で注釈が付けられたパラメーターを持つメソッドにのみバインドするようにするにはどうすればよいですか?
java - アノテーション @MyFormat("%td.% を使用して getBirthday() をフォーマットするにはどうすればよいですか
サブクラスを手動で記述せずに、 @MyFormat アノテーションの値で書式設定された Date ではなく、Person インスタンスを受け取り、誕生日を文字列として返すクラスを生成するにはどうすればよいですか?
目的は、生成されたインスタンスを HTML ページの生成に使用することです
サブクラスを手動で記述せずに、 @MyFormat アノテーションの値で書式設定された Date ではなく、Person インスタンスを受け取り、誕生日を文字列として返すクラスを生成するにはどうすればよいですか?
目的は、生成されたインスタンスを HTML ページの生成に使用することです。
私はこれを持っています(下記参照)。
呼び出しは式 "person.birthday" の評価からのリフレクションによって行われるため、戻り値の型が Date から String に変更されても問題ありません。
したがって、新しいクラスのメソッド名は「String getBirthday()」と同じですが、戻り値は String になります。
jszipを使用してSafari 8でzipファイルをファイル名と拡張子で保存するにはどうすればよいですか?
ライブラリzip
を使用してクライアント側にファイルを保存したい。jszip
これが私のコードです:
Safari 8 を除くすべての最新のブラウザーで問題なく動作します。
Safari 8 は、ファイル拡張子を持つファイルを保存できません。
これはサンプルhttp://jsfiddle.net/uvhy34ar/3/で、この問題の動作を示しています。
サブクラスを手動で記述せずに、 @MyFormat アノテーションの値で書式設定された Date ではなく、Person インスタンスを受け取り、誕生日を文字列として返すクラスを生成するにはどうすればよいですか?
目的は、生成されたインスタンスを HTML ページの生成に使用することです
サブクラスを手動で記述せずに、 @MyFormat アノテーションの値で書式設定された Date ではなく、Person インスタンスを受け取り、誕生日を文字列として返すクラスを生成するにはどうすればよいですか?
目的は、生成されたインスタンスを HTML ページの生成に使用することです。
私はこれを持っています(下記参照)。
呼び出しは式 "person.birthday" の評価からのリフレクションによって行われるため、戻り値の型が Date から String に変更されても問題ありません。
したがって、新しいクラスのメソッド名は「String getBirthday()」と同じですが、戻り値は String になります。
jszipを使用してSafari 8でzipファイルをファイル名と拡張子で保存するにはどうすればよいですか?
ライブラリzip
を使用してクライアント側にファイルを保存したい。jszip
これが私のコードです:
Safari 8 を除くすべての最新のブラウザーで問題なく動作します。
Safari 8 は、ファイル拡張子を持つファイルを保存できません。
これはサンプルhttp://jsfiddle.net/uvhy34ar/3/で、この問題の動作を示しています。
java - バイトバディコード生成
私は豆のクラスを持っています
および検証ユーティリティ:
以下のようなバリデーターを生成したいと思います-
どのフィールドが必須で、どの値が特定の数を超えてはならないかの決定は、Bean クラスを参照して実行時に行われます。
Byte Buddy でこれを行うにはどうすればよいですか?
java - Android : load(getClass().getClassLoader(),classLoadingStrategy) が java.lang.IllegalStateException をスローします
Androidのメソッドproxy(...)の下にbyteBuddyオブジェクトを作成し、byteBuddyオブジェクトでいくつかのメソッドを呼び出そうとしています:
しかし、次のとおりです。
ByteBuddy が例外をスローします:
java:781) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕ at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System .err﹕ ... 25 more 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕ 原因: java.lang.NoClassDefFoundError: ブート クラス ローダーを使用してクラスが見つかりません。利用可能なスタックがありません 371 12028-12028/com.example.AndroidOverlay W/System.err﹕ ... 25 more 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕ 原因: java.lang .NoClassDefFoundError: ブート クラス ローダーを使用してクラスが見つかりません。利用可能なスタックがありません 371 12028-12028/com.example.AndroidOverlay W/System.err﹕ ... 25 more 06-11 21:29:23.371 12028-12028/com.example.AndroidOverlay W/System.err﹕ 原因: java.lang .NoClassDefFoundError: ブート クラス ローダーを使用してクラスが見つかりません。利用可能なスタックがありません
http://central.maven.org/maven2/com/google/android/tools/dx/1.7/dx-1.7.jar および byte-buddy-0.6.8.jar, byte- の dx-1.7.jar を使用していますバディ-android-0.6.8.jar
何か不足していますか?私はまた、あなたのAndroidサンプルアプリケーションで動的タイプを実行できませんでした.(Failed resolution of: Lorg/objectweb/asmType;) も取得します.
EDIT1 : Lollipop を使用しています。これが AndroidClassLoadingStrategy のセットアップ方法です。
メソッドproxy(...)があるクラスMessengerに設定します
そしてclassLoadingStrategyは次のように定義されています
編集 2: 結局、私は ByteBuddy のサンプル アプリケーションを使用して、Android lollipop を置き換えるための行を試しました
交換する必要があるこれらの1つについて、それらをすべて試してみましたが、異なるクラスアクティビティからだけで、すべて同じ例外が発生します
まだ例外:
ここでエラーを再現する可能性があるため、Web サイトのソースを作成して配置しました。
bashism.com/shared/ByteBuddyTest.tar.gz
編集3:
Android バージョン: 5.0.1 ロリポップ
デバイス: Samsung Galaxy S4
IDE: IntelliJ アイデア 14.1.3
編集4: メインアクティビティ内で変更した後:
および net.bytebuddy.android.AndroidClassLoadingStrategy 内
}
動作/安定しているようで、すぐにさらにデバッグします
java - 生成された bytebuddy バイトコードを表示する
ByteBuddy を使用して、動的に生成されたバイト コードを使用して実行時にクラスを作成しています。生成されたクラスは意図したとおりに動作しますが、生成されたバイト コードを手動で調べて、それが正しいことを確認したいと考えています。
例えば
ここで、MyImplementation は複数の StackManipulation コマンドをチェーンして、動的に生成されたコードを作成します。
生成されたクラスをファイルに書き出すことはできますか (IDE で手動で検査できます)、または生成されたクラスのバイトコードを出力することはできますか?