18

私のアプリケーションの 1 つで、次のものを使用しています。

public void calculate (String className)
{
  ... 
  Class clazz = Class.forName(className);
  ...
}

この関数は、数回/秒呼び出されます。可能なクラス名は約 10 です。この関数内に内部キャッシングがあることは認識していますが、このキャッシングはネイティブ レベルでしか利用できないと思います。

このため、独自のキャッシングを追加する必要があるかどうか疑問に思い始めています。

private static Map<String,Class> classMap;

public void calculate (String className)
{
  ... 
  Class clazz = classMap.get(className);
  if (clazz == null) 
  {
      clazz = Class.forName(className);
      if (classMap == null) classMap = new HashMap<String, Class>(40);
      classMap.put(className, clazz);
  }
  ...
}

これはパフォーマンスの向上になりますか、それとも本当に違いはありませんか?

前もって感謝します

4

4 に答える 4

6

Class.forName()次の 2 つのことを行います。

  1. クラスローダーからロードされたクラスをフェッチします
  2. そのようなクラスが見つからない場合は、それをロードしようとします。

パート 1 はかなり速いです。#2 は、実際の作業が開始される場所です (JVM が、クラスローダーに応じて、ハードディスクまたはネットワークにヒットする可能性がある場所)。同じパラメータを渡すと、最初の呼び出し以外はステップ 2 に到達しません。

いいえ、おそらく最適化する価値はありません。

于 2013-08-14T12:45:26.370 に答える
2

いいえ、すべきではありません。Class.forName は同じクラスを 2 回ロードしませんが、ロードされたクラスの中からクラスを見つけようとします。それはネイティブレベルで行われ、非常に効率的であるはずです。

于 2013-08-14T12:44:42.307 に答える