Pergunta

Eu estou tentando implementar alguma unidade teste de um quadro de idade. Eu estou tentando zombar da camada de banco de dados. Infelizmente nossa estrutura é um pouco velho e não completamente utilizando as melhores práticas para que não haja uma clara separação de preocupações. Eu estou pouco preocupado que tentando zombar fora da camada de banco de dados pode fazer a carga JVM um grande número de classes que não vai mesmo ser usado.

Eu realmente não entendo carregadores de classe que bem assim que este pode não ser um problema. Existe uma maneira de tomar um pico em todas as classes de um ClassLoader particular tem carregados para provar o que está acontecendo sob o capô?

Foi útil?

Solução

Esteja avisado que usando

java -verbose

irá produzir uma enorme quantidade de saída. Registrar a saída para um arquivo e, em seguida, usar grep. Se você tem o filtro 'tee' você pode tentar o seguinte:

java -verbose | tee classloader.log
grep class classloader.log

Outras dicas

Você pode criar seu próprio Classloader e usar isso para carga durante o teste de unidade. Ter o seu próprio costume Classloader imprimir o que está fazendo.

Ou se você só quer saber quais classes são carregadas, faça:

java -verbose:class

Eu não tenho certeza. Mas há uma maneira que eu vejo isso poderia ser feito. Ele embora talvez overrly ridículo. Você pode tentar a aspectos e colocar um pointcut para loadClass. Também talvez o argumento JVM -verbose talvez útil.

Como uma forma alternativa, para uma determinada classe-loader como você mencionou, você pode usar este trecho de código. valor apenas mudança de obj variável, se quiser.

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
    }
}

Você pode usar a opção -Xlog Para configurar ou habilitar o registro com a Máquina Virtual Java (JVM) unificado quadro de exploração madeireira. A vantagem é que você pode escrever os resultados para arquivo de texto

Sinopse

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]

Na sintaxe Log Unificado, -verbose:class igual -Xlog:class+load=info

Por exemplo

java -Xlog:class+load=info:classloaded.txt

Ocarle doc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top