15

古いフレームワークの単体テストを実装しようとしています。データベースレイヤーをモックアウトしようとしています。残念ながら、私たちのフレームワークは少し古く、ベストプラクティスを十分に使用していないため、関心の分離は明確ではありません。データベース層をモックアウトしようとすると、JVMが使用されない膨大な数のクラスをロードする可能性があるのではないかと少し心配しています。

私はクラスローダーをあまりよく理解していないので、これは問題ではないかもしれません。特定のClassLoaderがロードしたすべてのクラスでピークを迎えて、内部で何が起こっているかを証明する方法はありますか?

4

4 に答える 4

45

独自のクラスローダーを作成し、それを使用して単体テスト中にロードできます。独自のカスタム Classloader に、何をしているかを出力させます。

または、ロードされているクラスを知りたいだけの場合は、次のようにします。

java -verbose:class
于 2009-11-10T02:02:12.587 に答える
18

使用することに注意してください

java -verbose

膨大な量のアウトプットを生み出します。出力をファイルに記録してから、grep を使用します。「tee」フィルターがある場合は、これを試すことができます:

java -verbose | tee classloader.log
grep class classloader.log
于 2009-11-10T02:16:25.727 に答える
3

私はわかりません。しかし、それができると私が思う一つの方法があります。それは多分ひどくばかげています。アスペクトを試して、ロードクラスのポイントカットを設定できます。また、jvm引数-verboseが役立つ場合もあります。

于 2009-09-22T15:41:44.753 に答える
1

別の方法として、言及した特定のクラスローダーに対して、このコードスニペットを使用できます。必要に応じて、obj 変数の値を変更するだけです。

Object obj = this;
ClassLoader classLoader = obj.getClass().getClassLoader();
File file = new File("classloderClasses.txt");
if (file.exists()) {
    file.delete();
}
if (classLoader != null) {
    try {
        Class clClass = classLoader.getClass();
        while (clClass != ClassLoader.class) {
            clClass = clClass.getSuperclass();
        }
        java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
        classesField.setAccessible(true);
        Vector classes = (Vector) classesField.get(classLoader);
        FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true);
        fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes());
        fos.write(Arrays.toString(classes.toArray()).getBytes());
        fos.close();
    } catch (Exception exception) {
        exception.printStackTrace();
        // TODO
    }
}
于 2017-09-05T13:18:01.007 に答える