Olá pessoal do Guj! Estou com uma Duvida… tenho com um código que cria um arquivo .java a partir de dados do usuário e quero carregar este arquivo para utilizar Reflection nele a fim de detectar se este código possui o método main. Alguém conhece algo que possa me ajudar nisto?
Carregar Arquivo .java em tempo de execução
4 Respostas
? Você precisa usar o compilador (javac) para gerar um .class que você possa usar para carregar via reflection e determinar se o método tem um “main”.
Na verdade entanglement, eu recebo um arquivo .java, e quero verificar nele se existe o método main, creio que da para fazer isso só com o I/O mas será que não tem uma forma de usar reflection neste arquivo que estou recebendo para facilitar o trabalho? pois se eu compilar um código sem main, o javac irá acusar a ausência do método e creio eu que não irá testar possíveis erros de sintaxe no código recebido.
Você pode compilar um código sem main. Ele só precisa estar sintaticamente correto (ou seja, dentro de um .java deve haver uma ou mais classes ou interfaces, sendo que no máximo uma delas pode ser uma classe ou interface pública, e nesse caso o nome da classe ou interface deve bater com o nome do arquivo.
Reflection só trabalha sobre classes carregadas (ou seja, instanciadas com Class.forName) - isso indica que você obrigatoriamente precisa ter um .class, e esse .class precisa conseguir acessar as outras classes de que ele depende.
Existe a classe Class que permite você manipular código Java dinamicamente, neste caso você pode ler quais são os métodos e uma classe.
Isso é o primórdio de Reflexão em Java.
Veja o exemplo:
public static void main(String[] args) {
String classe = "br.com.projeto.UmClasseQualquer";
Class cls = null;
Class superCls = null;
// Procura a classe informada
try {
cls = Class.forName(classe);
} catch (ClassNotFoundException e) {
System.err.println("Não encontrou a classe");
System.exit(0);
}
superCls = cls.getSuperclass();
if (superCls != null && !superCls.equals(Object.class)) {
System.out.format("%s herda %s", classe, superCls.getName());
}
Method[] methods = cls.getDeclaredMethods();
for (Method m: methods) {
Class retType = m.getReturnType();
Class[] paramTypes = m.getParameterTypes();
String name = m.getName();
System.out.print(Modifier.toString(m.getModifiers()));
System.out.print(" " + retType.getName() + " " + name + "(");
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0)
System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
Ainda se você quiser gerar um .java antes disto, isso já não tem a ver com Reflection, mas tem a ver com escrita de arquivo texto. Após escrever o arquivo .java via programação, você deve chamar o javac conforme já disseram e analisar se o compilador retornou sucesso para seguir em frente.
Se existir qualquer dúvida sobre Java, entre em contato em meu blog: