Capturar class do sistema de arquivo

Ola pessoal, tenho uma aplicação que precisa deixar o usuário escolher um arquivo no sistema de arquivos dele, este arquivo vai ser um .class, quando escolher preciso verificar se este contém o método main… dai que ta o problema, a dificuldade não é verificar se contém o método main, é conseguir pegar esse class, porque quando utilizo o JFileChooser vem um File pra mim, dai não consigo converter em Class. Alguém sabe como resolver isso?

Você já tentou usar o getClass(); ?

getClass() de qual objeto!?! Não tenho o objeto, a unica coisa que tenho é o File retornado pelo JFileChooser e se eu fizer um getClass() nele vai me retornar um “java.io.File”.

Para converter um arquivo .class em uma classe, você precisa carregá-lo com um classloader.

Vou dar um exemplo daqui a pouco.

Estou usando um exemplo super-bobo; em condições normais, você deveria usar o framework "ASM", mas ele é um pouco mais difícil de usar, portanto estou usando só ClassLoader e reflection normal.

import java.util.*;
import java.io.*;
import java.lang.reflect.*;

/**
 * Exemplo bobo de carregar uma classe, só para ver
 * se ela tem o método main. O correto é usar
 * o pacote "ASM" ( http://asm.objectweb.org ) 
 * que permite obter muito mais informação sobre a classe.
 */
class MeuClassLoader extends ClassLoader {
    File dirClasses;
    
    /**
    * Construtor
    * @param pDirClasses O diretório onde encontrar as classes.
    */
    public MeuClassLoader(File pDirClasses) {
        dirClasses = pDirClasses;
    }
    
    /**
    * @param name o nome da classe
    */
    public Class findClass (String name) {
        try {
            // bastante ingênuo, seu programa não iria fazer isto aqui
            File arqClasse = new File (dirClasses, name + ".class");
            InputStream inps = new FileInputStream (arqClasse);
            byte[] bytes = new byte[(int) arqClasse.length()];
            inps.read (bytes);
            inps.close();
            return defineClass (name, bytes, 0, bytes.length);
        } catch (IOException ex) {
            return null;
        }
    }
}

/** Esta classe tem um método main(String[]) */
class Teste {
    public static void main(String[] args) {
    }
}

/** Esta classe não tem um método main(String[]). */
class Teste2 {
    public static void main(int args) {
    }
}

/** A versão abaixo é para Java 1.4 ou anterior. Para Java 5.0
 * o código correspondente está comentado com [5]
 */
class CarregarClasse {
    
    public static void main(String[] args) throws Exception {
         MeuClassLoader mcl = new MeuClassLoader (new File ("."));
         Class kls = mcl.findClass ("Teste");
//[5]  Class&lt?&gt kls = mcl.findClass ("Teste");
         Method meth = kls.getMethod ("main", new Class[]{String[].class});
         // Deve imprimir "public static void Teste.main(java.lang.String[])"
         System.out.println (meth);
         Class kls2 = mcl.findClass ("Teste2");
//[5]  Class&lt?&gt kls2 = mcl.findClass ("Teste2");
         // Isto deve gerar uma exceção "java.lang.NoSuchMethodException"
         // pois o método main(String[]) não existe.
         Method meth2 = kls2.getMethod ("main", new Class[]{String[].class});
         System.out.println (meth2);
    }
}