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<?> 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<?> 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);
}
}