2012-05-02 11 views
3

java.lang.instrument APIを使用してjava.lang.Objectコンストラクターに静的メソッド呼び出しを追加しようとしています。私はSystem.gc()を呼び出すと動作するので、私は基本が正しいことを知っています。私は、計測器の有無にかかわらず-verbosegcを実行することでこれを確認しました。致命的なエラーをどのように分析しますか?

ありませんが失敗した-javaagentの処理:ネイティブメソッド内のスレッド「メイン」FATAL ERRORに

例外:私は私自身のパッケージ内の静的クラス/メソッドへのメソッド呼び出しを変更した場合、私は致命的なエラーが出ますダンプファイルは作業ディレクトリに作成されるので、何が問題なのか把握するのは難しいです。その他の情報:私は思うものの

  • 私は、静的メソッドの呼び出しが最後のクラスがロードされ
  • 新規オブジェクトの作成にはなりません
  • 変換前の静的メソッドのクラスはpremainメソッドにロードされていることを確認がInterruptedIOExceptionではありますそれは単なる副作用です

ありがとうございます。

+1

私はここにhttp://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-文書化されているように、エージェントのjarマニフェスト内のブートクラスパスにバイトコード生成LIBSを追加しなければならなかったことが判明summary.html – barry

答えて

1

はい、@ barryが彼のコメントで述べたように、JavaエージェントのマニフェストにBoot-Class-Pathの定義を追加する必要があります。私にとっては、私は私のマニフェストは、次のようになりますので、バイトコードを作成するために、私のエージェント内Javassistの使用:

Manifest-Version: 1.0 
Premain-Class: com.company.agent.Agent 
Agent-Class: com.company.agent.Agent 
Boot-Class-Path: javassist-3.18.2-GA.jar agent.jar 

私はJavassistのとエージェントのjarファイルと同じlibディレクトリ内のすべての私のアプリケーションのjarファイルを持っています。クラスパス上のすべてを同じフォルダ内に置いて動作させます。