2011-02-03 7 views
2

リフレクションを使うと、クラスに関するすべてを得ることができます。宣言されたメソッド、フィールド、クラス(そして場合によってはそれ以上)をすべて取得できますが、メソッドに反映する方法が見つからないため、そのメソッドが使用しているクラスを見つけることができます。Javaがメソッドのスコープの変数に反映する

私は基本的に、特定のクラスにある他のクラスへのすべての依存関係を調べたいと思います。

例:どのように私はMyClassのは、そのコンストラクタに工assを使用していることを知ることができます

import com.yada.yada.yada.SomeClass 

public class MyClass 
{ 
    public MyClass 
    { 
    new SomeClass(); 
    } 
} 

: は、次のコードを考えると?

私は、クラスファイルに定義されているすべてのインポートステートメントを取得する方法を考えようとしていましたが、それでも何も見つかりませんでした。しかし、クラスファイルに定義されているすべてのimport文を何とか掘り起こす方法があると仮定すると、import文を必要としない同じパッケージに定義されているクラスについてはどうでしょうか?

EDIT:

シナリオ:目標は、他のプロセスに、このクラス(MyClassの)のバイトコードを送信することです。この他のプロセスはバイトコードを受け取り、クラスローダーを使用してクラス(MyClass)をロードします。問題は、他のプロセスでMyClassのインスタンスを作成して実行しようとすると、SomeClassの定義が見つからないために失敗するということです。

SomeClassがMyClassのメンバーだった場合、それは問題ではありませんが、それに対する唯一の参照はメソッドにあるため、リフレクションを介して取得する方法はありません。

答えて

2

クラスの依存関係をすべて取得するには、クラスローダーメカニズムにフックし、検査しているクラスがインスタンス化され、そのメソッドが呼び出されるときにどのクラスが読み込まれるかを記録することが最も近いと思います。あなたのものの中で、あなたは推移的にも、すべてのクラスを得るでしょう。間接的には、は、あなたが実際に必要とするかもしれない情報で何をしたいかによって決まります。

しかし、すべての場合に対応することは不可能です(呼び出すたびにランダムなクラス名を尋ねるのにClass.forName()を使用する方法を想像してください)。

クラスローダの概念は本当に唯一の完全修飾クラス名を尋ねることができますので、1は、同じパッケージ一般的に行うために、実際には不可能だ

で定義されたクラスを知るだろうかとどちらかそのクラスを取得するか、ClassNotFoundExceptionです。クラスはWebサーバー(アプレットの場合)からロードしたり、オンザフライで生成したりすることができるので、特定のクラスが存在するかどうか知ることはできません。

+0

問題のクラスがこのプロセスでインスタンス化されない場合(最後の編集、シナリオビットを参照) – JHollanti

+0

@JHollanti:それは反射を使用する場合、あなたは完全に運のないです。また、バイトコードを調べることによって直接依存関係を得ることはできますが、依然として間接依存の問題があります。 –

+0

それは吸う。さて、絵本に戻って。ご協力いただきありがとうございます。 – JHollanti

2

(バイトコードを逆コンパイルしない限り)できません。ローカル変数はどのクラスインスタンスにも束縛されておらず、クラスやインスタンスのほとんどのライフタイムには存在しないため、リフレクションを介してアクセスすることはできません。

達成しようとしていることは何ですか?実際の問題について知りたい解決策ではなく、実際の問題について教えてもらえれば、私たちはより良い対応をすることができます。

+0

質問を編集しました。 – JHollanti

1

ここではリフレクションはお手伝いしません。私が考えることのできる唯一の方法は、asmのようなバイトコードツールを使用することです。

作成

  • クラスの宣言からの依存関係を収集ClassVisitor
  • 注釈
  • ローカル変数宣言
  • フィールド宣言
  • メソッド宣言
  • メソッドの呼び出し
  • (私は何かを忘れてしまったのですか?)
関連する問題