Alguém sabe como descobrir programaticamente de onde o java classloader realmente carrega a classe?
Costumo trabalhar em grandes projetos em que o caminho da classe fica muito longo e a pesquisa manual não é realmente uma opção. Recentemente, tive um problema em que o carregador de classes estava carregando uma versão incorreta de uma classe porque estava no caminho de classe em dois locais diferentes.
Então, como posso fazer com que o carregador de classes me diga de onde vem o arquivo de classe real?
Edit: E se o carregador de classes realmente não carregar a classe devido a uma incompatibilidade de versão (ou outra coisa), existe alguma maneira de descobrir qual arquivo está tentando ler antes de lê-lo?
java
classpath
classloader
Lucas
fonte
fonte
Respostas:
Aqui está um exemplo:
Este impresso:
fonte
Test.class.getResource("Test.class")
que não repete o nome do pacote.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
o nome completo do pacote, no entanto, é necessário.getClassLoader()
retornarnull
. Veja aqui uma extensão deste método para lidar com isso.Outra maneira de descobrir de onde uma classe é carregada (sem manipular a fonte) é iniciar a Java VM com a opção:
-verbose:class
fonte
fonte
Isto é o que usamos:
Isso funcionará dependendo da implementação do ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
fonte
A versão de Jon falha quando o objeto
ClassLoader
é registrado, onull
que parece implicar que ele foi carregado pela inicializaçãoClassLoader
.Este método lida com esse problema:
fonte
Edite apenas a 1ª linha:
Main
.classResultado:
Talvez estilo ruim, mas funciona bem!
fonte
Normalmente, não fazemos o que usar codificação. Podemos obter className primeiro e, em seguida, usar ClassLoader para obter o URL da classe.
fonte
Dê uma olhada nesta pergunta semelhante. Ferramenta para descobrir a mesma classe.
Eu acho que o obstáculo mais relevante é se você tiver um carregador de classe personalizado (carregando de um db ou ldap)
fonte
Maneira simples:
Exemplo de saída:
Ou
Exemplo de saída:
fonte
Essa abordagem funciona para arquivos e jars:
fonte
Supondo que você esteja trabalhando com uma classe chamada
MyClass
, o seguinte deve funcionar:A obtenção ou não da localização em disco do arquivo .class depende do próprio carregador de classes. Por exemplo, se você estiver usando algo como o BCEL, uma determinada classe pode nem ter uma representação no disco.
fonte