Como verificar se um arquivo .class está corrompido via código?
7 respostas
S
seleghini
Pessoal,
Gostaria de saber como posso descobrir se um arquivo .class qualquer está corrompido via código, pois necessito fazer essa verificação antes de executar o findbugs .
Tentei com o ClassLoader mas não sei se fiz corretamente, não deu certo.
Seguinte por não saber a finalidade, então diria para você gerar um MD5 (Hash do arquivo) do arquivo original para comparação com o outro, isso caso seja por exemplo para verificar se uma atualização ocorreu normalmente, desta forma, você consegue realizar esta validação, só lembrando que você teria que gerar o MD5 1 vez do arquivo correto para comparar depois em sua base de dados.
publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");Filef=newFile("c:\myfile.txt");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);Stringoutput=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Unable to process file for MD5",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Unable to close input stream for MD5 calculation",e);}}}
Agora se você não tem o arquivo original para gerar a comparação acredito que a única forma seria instanciando a classes e tratar por excessão visto que se um arquivo esta corrompido ele não será executado corretamente.
Espero ter ajudado.
S
seleghini
montroni:
Seguinte por não saber a finalidade, então diria para você gerar um MD5 (Hash do arquivo) do arquivo original para comparação com o outro, isso caso seja por exemplo para verificar se uma atualização ocorreu normalmente, desta forma, você consegue realizar esta validação, só lembrando que você teria que gerar o MD5 1 vez do arquivo correto para comparar depois em sua base de dados.
publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");Filef=newFile("c:\myfile.txt");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);Stringoutput=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Unable to process file for MD5",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Unable to close input stream for MD5 calculation",e);}}}
Agora se você não tem o arquivo original para gerar a comparação acredito que a única forma seria instanciando a classes e tratar por excessão visto que se um arquivo esta corrompido ele não será executado corretamente.
Espero ter ajudado.
valeu montroni, mas acho que seria bem mais simples pois é o seguinte eu recebo um parametro com o caminho de um arquivo .class, eu só preciso verificar se ele está normal ou corrompido, pois se eu executar o findbugs com esse arquivo corrompido ele trava a minha aplicação.
Então acho que seria apenas mesmo a instancia da classe mas não sei como fazer isso
Obrigado
montroni
Então acredito que este código abaixo deve te ajudar:
lembrando que eu sempre recebo como parametro apenas o caminho do .class
Obrigado
rogelgarcia
Você pode criar um classloader personalizado que lê a classe de onde desejar.
Nao pensei nas implicações disso. Mas deve-se tomar cuidado com isso pois pode usar memória permgen demais caso não seja possível eliminar (garbage collect) as classes já carregadas.
S
seleghini
rogelgarcia,
mas como eu faria um classloader personalizado pois vi alguns exemplos e não deu certo
Obrigado
rogelgarcia
Porque nao deu certo?
[criar um classloader não é das tarefas mais triviais mesmo não… mas acho que seguindo um exemplo… dá certo]
Experimente pegar um exemplo que já funcione e então modifique ele para atender aos seus requisitos, talvez seja mais fácil.
Dê uma olhada no projeto ASM. É uma API para manipulação de bytecode, talvez seja mais interessante.