2011-02-09 9 views
2

私が知る限り、すべてがJavaのオブジェクトです。Java:メソッドはJREのスーパークラスを継承しますか?クラスはObjectを継承しますか?

私はJava JDKを見ており、より多くのデバッグ操作を実行できるカスタムJDKの作成を試しています。たとえば、Object.javaクラスを変更してすべてのオブジェクトを操作できます。

私の質問です。メソッドはJREのクラスも継承するので、この親を例えば変更することができます。最も最近渡された引数を保存するメソッドを作成しますか?

ありがとうございました。

+1

私は、まずJikes RVMのような既存の研究VMをチェックアウトすることをお勧めします。 VMの実装中に発生する多くの問題については、そこで議論され、文書化されています。 – biziclop

+0

@biziclop、それは私がそれぞれのメソッドをクラスの静的変数に渡した引数を最後に保存するようにするでしょうか? – Tom

+0

@Tomいいえ、VMを修正することを実際に試したいのであれば、それは良い出発点です。 Sun VMを変更して何も動作しないのか不思議に思うよりも少し不満です。 :) – biziclop

答えて

3

デバッグを強化したい場合は、まずJVMTIが提供するものを調べることができます。それ以前でさえ、JDIが、JVMTIの上に構築されたはるかに高いレベルのAPI(したがって使い易いAPI)が必要であるかどうかを確認してください。

あなたが言っていることはそれ自体では可能ではないが、BCELのようなバイトコード操作ライブラリを使用してinstrumentationによって同様の効果を達成することができます。

具体的な例として、メソッドの呼び出しとそのパラメータを記録する場合は、JDIでブレークポイントを設定してコールスタックを照会するだけです。

+0

"JDIでブレークポイントを設定し、コールスタックにクエリすることでトリックを行うことができます"、これはやや複雑です。これはアプリケーションのソースを変更することなく可能ですか? – Tom

+0

@Tom:それはアイデアです:JDI/JVM TIは、そのJVM上で動作するコードを変更せずに、実行中のJVMと対話できます。あなたに提供されたリンクを読んでください。 –

+0

@Joachim Sauer、アプリケーションをデバッグモードで実行する必要がありますか? – Tom

5

いいえ、Javaのすべてがオブジェクトではありません。メソッドはオブジェクトではなく、プリミティブ値はオブジェクトではなく、参照はオブジェクトではありません。オブジェクトはJava(および配列)内のオブジェクトのみです。

クラス(java.lang.Class)を表すオブジェクト、メソッド(java.lang.reflect.Method)、コンストラクタ(java.lang.reflect.Constructor)とフィールド(java.lang.reflect.Field)があります。しかし、 "何かを表現する"ことは、 "存在する"ことと同じではありません。

だからいいえ:メソッドはオブジェクトではなく、基本クラス(または「基本メソッド」)から継承しません。

低レベルでJVMと対話したい場合は、JVM TIが正しいAPIかもしれません。

1

フィールド、メソッド、パラメータ、ローカル変数は、Javaではオブジェクトではありません。オブジェクトには反射を使用して表現できますが、オブジェクトではありません。

渡された引数をトレースするようにメソッドの動作を変更したい場合は、コードインジェクションを使用できます。例えばAspectJはこれを行い、それを行う方法の例を持っています。

+0

私はおそらく、アプリケーション自体のソースではなく、ランタイムのソース(JRE)のみを制御できると述べたはずです。 AspectJはまだここにオプションがありますか? – Tom

+0

AspectJは、JREによってロードされるバイトコードを変更できます。 JAR /クラスに直接アクセスする必要はありません。理論的には可能ですが、ロードした後にバイトコードを変更できるとは思いません。 ;) –

関連する問題