Obtendo informações de classe de tempo de execução da web? Algo como Javap, mas em tempo de execução na aula carregada na memória
Pergunta
Estou trabalhando com problemas com o WebSphere e complicados de carga de classe. Quero poder baixar ou imprimir informações que normalmente seriam impressas pelo Javap (os métodos, etc.).
Também posso precisar obter os dados de classe binária bruta, para executar um diferencial binário.
Como você faria isso?
Solução
Você pode escrever um servlet ou jmx mbean que expõe a classe ao seu cliente.
Servlet:
String resourceParameter = ...;
OutputStream out = ...:
InputStream input = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(resourceParameter)
write(input, out);
Cliente:
GET http://host/DiagnosticServlet?resource=your/ClassName.class
O parâmetro de recurso deve ser o seu arquivo de classe your.className -> your/ClassName.class. Você pode salvar o arquivo e usar o Javap.
(Acho que o mBean precisa codificar seu arquivo de classe em uma string (por exemplo, base 64) como byte [] não é suportado. Mas não tenho certeza disso. O resto seria o mesmo.)
Se isso for implantado em produção, alguma forma de autenticação deve ser configurada.