Como verificar se um arquivo .class está corrompido via código?

7 respostas
S

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.

Obrigado

7 Respostas

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.

peguei um exemplo de geração de hash arquivo mesmo no forum postado pelo mario.fts http://www.guj.com.br/java/107647-gerar-hash-de-arquivo:

public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException {   
    MessageDigest digest = MessageDigest.getInstance("MD5");   
    File f = new File("c:\myfile.txt");   
    InputStream is = new FileInputStream(f);                   
    byte[] buffer = new byte[8192];   
    int read = 0;   
    try {   
        while( (read = is.read(buffer)) > 0) {   
            digest.update(buffer, 0, read);   
        }         
        byte[] md5sum = digest.digest();   
        BigInteger bigInt = new BigInteger(1, md5sum);   
        String output = bigInt.toString(16);   
        System.out.println("MD5: " + output);   
    }   
    catch(IOException e) {   
        throw new RuntimeException("Unable to process file for MD5", e);   
    }   
    finally {   
        try {   
            is.close();   
        }   
        catch(IOException e) {   
            throw new RuntimeException("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

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.

peguei um exemplo de geração de hash arquivo mesmo no forum postado pelo mario.fts http://www.guj.com.br/java/107647-gerar-hash-de-arquivo:

public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException {   
    MessageDigest digest = MessageDigest.getInstance("MD5");   
    File f = new File("c:\myfile.txt");   
    InputStream is = new FileInputStream(f);                   
    byte[] buffer = new byte[8192];   
    int read = 0;   
    try {   
        while( (read = is.read(buffer)) > 0) {   
            digest.update(buffer, 0, read);   
        }         
        byte[] md5sum = digest.digest();   
        BigInteger bigInt = new BigInteger(1, md5sum);   
        String output = bigInt.toString(16);   
        System.out.println("MD5: " + output);   
    }   
    catch(IOException e) {   
        throw new RuntimeException("Unable to process file for MD5", e);   
    }   
    finally {   
        try {   
            is.close();   
        }   
        catch(IOException e) {   
            throw new RuntimeException("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:

Object o = Class.forName("pacote.pacote1.nomeDaClasse").newIstance();

Acima ele irá tentar instanciar a sua classe.

S

montroni:
Então acredito que este código abaixo deve te ajudar:

Object o = Class.forName("pacote.pacote1.nomeDaClasse").newIstance();

Acima ele irá tentar instanciar a sua classe.

então fiz isso mas ainda está retornando uma exception segue abaixo ela :

java.lang.ClassNotFoundException: C:\workspace\arquivos\java\caso5\java\AdicionaProduto.class
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at com.testes.VerificaClass.main(VerificaClass.java:33)

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

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.

http://asm.ow2.org/

Criado 8 de julho de 2011
Ultima resposta 8 de jul. de 2011
Respostas 7
Participantes 3