問題タブ [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 - MethodDelegation による回避アドバイスの実装
私はここで説明されているメソッド委譲をとても楽しんでいます:
http://www.javacodegeeks.com/2015/01/make-agents-not-frameworks.html
これはうまく機能します:
呼び出しをインターセプトし、メソッドに渡された引数を取得できます。これは、私が達成したいことの半分です。ただし、戻り値をキャプチャする同様に簡潔な方法は見つかりませんでした。呼び出しを実行するインターセプターに Callable を渡すことができることはわかっていますが、その道をたどると、スタックトレースが台無しになる確実な方法のように思えます。
「アラウンドメソッド」パターンを実装するには、簡単で標準的な方法があるはずです。
API for reals を掘り下げる前に: 何か足りないものはありますか?
java - ByteBuddy IllegalStateException: 添付ファイル プロバイダーは現在の JVM に接続できません
別の値を返すために何らかのプロセスによってロードされるクラスをモックしようとしています。
私が持っていると言う
そして、いくつかのプロセスがClassA.getTheClass()
戻るように呼び出した場合ClassC
(もちろん実装しますIClassType
)
どういうわけか、Byte Buddy のホットスワップ機能を使えばこれが可能になるはずだとわかりました。しかし、エージェントのインストールに失敗します。-javaagent:C:\byte-buddy-agent-0.7.1.jar
私は私に与えるスイッチで試しました
ByteBuddyAgent.install();
と同様に
私のマシンで。これは OpenJDK でのみ機能しますか? 何か不足していますか?
java - Byte Buddy を使用して Java 8 ラムダ式の呼び出しをインターセプトする
次のように、Byte Buddy を使用して、メソッドの呼び出しと Java 8 ラムダ式の呼び出しをインターセプトしようとしAgentBuilder
ます。
Byte Buddy v0.7.1 を使用しています。
以下をインターセプトできますRunnable
(匿名クラス)。
もちろん、通常の(非匿名) クラスとして定義されたオブジェクトへの呼び出しも含まれます。ただし、インターセプトは、次のようなラムダ式では機能しません。
ラムダ式の呼び出しも傍受するにはどうすればよいですか? 私の知る限り、Byte Buddy にはLambdaInterceptorのようなものはありません。
java - Byte Buddy を使用して Java および Groovy コードへのメソッド呼び出しをインターセプトする: 奇妙な java.lang.VerifyError
Byte Buddy 0.7.1 を使用して、Java (8) と Groovy (2.4.5) が混在するプロジェクトからクラスのメソッドへの呼び出しをインターセプトしようとしています。
のような特定のパッケージ内のクラスのメソッド呼び出しとその引数のための小さな「汎用ロギング フライト レコーダー」のようなものを作成するという考えですfoo
。
私は Byte BuddyAgentBuilder
と私のカスタムLogInterceptor
を使用して、アプリケーションの起動時にこれを行います。
メソッドのインターセプトは、すべての Java クラスに対して正常に機能します。@CompileStatic
また、アノテーションを持つすべての Groovy クラスで正常に機能します。
java.lang.VerifyError
しかし、奇妙なs のような古典的な (動的な) Groovy クラスでは失敗します
何が起きてる?Byte Buddy は Groovy メソッドのインターセプトをサポートしていますか?
java - コンストラクターでのインターセプトにより ClassNotFoundException が発生する
で注釈が付けられたコンストラクターを傍受しようとしてい@Inject
ます。これは、小さな単体テストのコンテキストではうまく機能しました。ただし、Spring のような DI コンテナーのコンテキストでは、ClassNotFoundException
.
根本的な原因を絞り込むことができました。インストルメント化されたクラスを呼び出すgetDeclaredConstructors
と、この例外がトリガーされます。興味深いことに、最初にそのクラスのインスタンスを作成すると、問題はなくなります。
例えば:
スタック スタック トレースは次の場所にあります: http://pastebin.com/1zhx3fVX
java - コンストラクタインターセプタの後と前
BEFORE コンストラクターインターセプターを作成する方法を知っています。
AFTER コンストラクターインターセプターを作成する方法を知っています。
次のインターセプターを使用します。
ただし、前後のインターセプターを作成する方法がわかりません。これが私が試したことです(メソッドですでに機能しているものに基づく単純なアプローチ):
このメソッド デリゲートを使用すると、次のようになります。
このセットアップでは、次のようになります。
完全なスタック トレース: