6

ご存知のように、Java では、メソッド名だけでは異なるメソッドを区別するのに十分ではありません。

メソッドを区別するには、次の情報が必要だと思います(間違っている可能性があります)。

(className, methodName, methodParameters)

さらに遠く、

  • 内部でより効率的にメソッドを識別する方法は?
  • 「メソッドID」について聞いたことがあります。上記のトリプルと整数の間にマッピングがあるため、JVM は解析後にメソッド ID のみを使用するということですか?
  • もしそうなら、それはシンボルテーブルに常駐していますか?

ありがとう!

4

4 に答える 4

7

メソッド記述子を指すCONSTANT_NameAndType_info構造体です。

ほとんどの場合、メソッド名、パラメーターの型、および (やや驚くべきことに) 戻り値の型で構成されています。

于 2012-06-16T04:05:37.780 に答える
0

あなたが何をしようとしているのかよくわかりませんが、それにもかかわらず、いくつかの可能な答えがあると思います:

  • Java 要素を識別するために JVM (および JNI ライブラリー) によって内部的に使用されるさまざまな文字列形式の 1 つであるJNI メソッド記述子に興味があるかもしれません。

  • あなたが話していることを知るのは難しいです。「メソッドID」は、java.lang.reflect.Methodオブジェクトの参照、または後述のメソッド記述子、またはその他のものにすることができます。それについてどこで読みましたか?

  • JVM内にそのようなテーブルがあるとは思えません。つまり、JVM 内で処理する場合でも、ほとんどの場合クラスからメソッドを取得するため、グローバルテーブルがあるとは思えないため、メソッドがクラスに格納されていると考えるのが妥当です。リフレクションを使用してメソッドを取得する場合のようです。

    Class clazz = String.class;
    Method method = clazz.getDeclaredMethod("charAt", Integer.TYPE);
    System.out.println(method.getName());
    

String一部の util クラスにメソッドを要求するのではなく、クラスにメソッドを要求することに注意してください。メソッドは、クラスから andcharAtを受け取ります。intString

言い換えれば、あなたの識別タプルはほぼ正しいです - それはクラスを持っていません:

(methodName, methodParameters)

クラス、メソッド名、パラメーターの型を渡して JVM からメソッドを取得する代わりに、メソッドをクラスから直接取得し、クラスにメソッド名とパラメーターの型を指定します。確かに微妙な違いですが、それはあなたが疑問に思っていることだと思います。

これは、後述する JNI 記述子でも明らかです。たとえば、メソッド

long f(int i, Class c);

次の記述子で表されます。

"(ILjava/lang/Class;)J"

メソッドのクラスへの参照がないことに注意してください。

クラスファイル形式に関する優れたドキュメント( @Lawence によって既に指摘されています) は、いくつかの洞察を与えるかもしれません。完全に読むことをお勧めします。

于 2012-06-16T04:23:39.000 に答える
0

1) メソッドをより効率的に内部的に識別する方法は?

内部的には何に?メソッドを「内部的に」「識別する」必要がある場所はたくさんあります。バイトコード コンパイラでは、JIT コンパイラ、クラスローダ/リンカ、クラスファイル表現、リフレクション API、デバッガなどがあります。それぞれに異なる効率性の問題があります。

2) 「メソッド ID」について聞いたことがあります。上記のトリプルと整数の間にマッピングがあるため、JVM は解析後にメソッド ID のみを使用するということですか?

メソッド ID はクラスファイル表現で使用され、クラスローダー/リンカー、JIT コンパイラー、デバッガーなど、それに基づくあらゆるもので使用できます。

JVM は Java コードを解析しません。

3) もしそうなら、それはシンボルテーブルに常駐していますか?

そうかもしれません。「シンボルテーブル」の意味によって異なります。クラスのライフサイクル全体を通して、メソッドの識別が必要な場所がたくさんあることに注意してください。たとえば、Java リフレクション API には、getDeclaredMethod(...)や のさまざまなメソッドなどのメソッドを実装するためのメソッド情報が必要ですMethod

于 2012-06-16T04:35:01.713 に答える
0

Java は常に完全修飾名によって言語要素を区別します。

パッケージにあるmyMethod(int a, int b)クラスにメソッドがあるとします。Java はそのメソッドを名前で識別します。MyClasscom.mypackagecom.mypackage.MyClass.myMethod(int a , int b)

さらに理解を深めるために、2 つの同一の要素を解決する必要がある場合は、クラス ローダーも考慮に入れます。

参照しているメソッドを含む特定のクラスをロードするためにどのクラスローダーが使用されたかを考慮します。Java には 4 種類のクラスローダーがあります。java.lang.Threadこれについては、クラスのドキュメントを読むことができます。

于 2012-06-16T04:08:40.743 に答える