Existe uma maneira de obter que as classes um ClassLoader foi carregado?
-
07-07-2019 - |
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ô?
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