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

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

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.

[quote=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.[/quote]

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

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.

[quote=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.

[/quote]

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

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.

rogelgarcia,

mas como eu faria um classloader personalizado pois vi alguns exemplos e não deu certo

Obrigado

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/