Pessoal,
Basicamente o que quero fazer é :
- Deixar que outra pessoa crie uma classe que implementa uma interface definida por mim, em um pacote definido por mim.
- Me enviar o .class desta classe ( não decidi se o fonte vem junto )
- Colocar estas classes juntas em um diretório.
- Conheço as assinaturas dos métodos, pois a interface é minha, mas o modo de implementação depende de cada um, gerando resultados diferentes.
- Interface ou Classe Abstrata ???
- Meu programa vasculha este diretório e lista as classes existentes lá.
- Escolho uma e carrego, chamo os métodos que quiser ( sei quais são ).
Encontrei esse trecho de código que carrega a classe de um arquivo, mas acho que além de ser pouco elegante na forma como chama o método ( gostaria de chamar da forma tradicional MyStuff.myMethod() ) dizem que fica carregada na VM ad eternum …
import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
private static String classOutputFolder = "/home/diretorio/das/classes";
public static void main(final String args[]) throws MalformedURLException {
runIt();
}
public static void runIt()
{
File file = new File(classOutputFolder);
try
{
URL url = file.toURI().toURL();
System.out.println("Caminho : " + url);
URL[] urls = new URL[] { url };
ClassLoader loader = new URLClassLoader(urls);
Class<?> thisClass = Class.forName("math.Calculator", true, loader);
Class<?> params[] = {};
Object paramsObj[] = {};
Object instance = thisClass.newInstance();
Method thisMethod = thisClass.getDeclaredMethod("testAdd", params);
thisMethod.invoke(instance, paramsObj);
}
catch (MalformedURLException e)
{
}
catch (ClassNotFoundException e)
{
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
Alguém conhece solução mais elegante ?
Grato.
PS: A classe que está sendo chamada :
package math;
public class Calculator implements ICalculator {
public void testAdd() {
System.out.println(200+300);
}
}