Reflection

2 respostas
J

Dae galera!! Tava tentando fazer um exemplo usando Reflection, mas tá dando o seguinte erro:

java.lang.ClassNotFoundException: ClasseDois
	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.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at feflection.CriaObjeto.criaObjeto(CriaObjeto.java:13)
	at feflection.CriaObjeto.main(CriaObjeto.java:28)

As classes:

import java.lang.reflect.*;

public class CriaObjeto {
	
	public void criaObjeto( String strClasse, String strMetodo ) throws Exception {
		
		Class parametros[] = new Class[ 2 ];
		parametros[ 0 ] = Integer.TYPE;
	    parametros[ 1 ] = Integer.TYPE;		           
		
		Class cls = Class.forName(strClasse);
		Method meth = cls.getMethod(strMetodo, parametros );
		
		Object argumentos[] = new Object[ 2 ];
		argumentos[ 0 ] = new Integer( 50 );
		argumentos[ 1 ] = new Integer( 20 );
		
		Object result = meth.invoke( this, argumentos );
		
	}
	
	public static void main(String[] args) {
		CriaObjeto objeto = new CriaObjeto();
		
			try {
				objeto.criaObjeto( "ClasseDois", "soma" );
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	

}
import javax.swing.JOptionPane;

public class ClasseUm {
	
	public void imprime( String valor ) {
		JOptionPane.showMessageDialog( null, valor  );
	}

}
public class ClasseDois extends ClasseUm {
	
	public void soma( int um, int dois ) {
		int total =  um + dois;
		this.imprime( "Total: " + total );
	}

}

Alguém sabe o que pode ser?
Valeu e fiquem com Deus!!!!

2 Respostas

J

Primeira coisa, tente colocar as classes dentro de um pacote e veja se elas estão realmente acessíveis no classpath.

Segundo, você está invocando um metodo da classe "ClasseDois" em um objeto da classe "CriaObjeto", veja:

Object result = meth.invoke( this, argumentos );

this é um objeto da classe CriaObjeto, e você está tentando chamar um metodo obtido da classe passada como parâmetro, você precisa de um objeto da classe "ClasseDois" para chamar esse método.

Ex.:

String str = "com.jairelton.Classe2";

Class clazz = Class.forName(str);

Method method = clazz.getMethod("soma", new Class[]{Integer.TYPE, Integer.TYPE});
Object obj = clazz.newInstance();
Object result = method.invoke(obj, new Object[]{new Integer(50), new Integer(20)});
System.out.println(result);
J

Valeu JairElton, deu certo!!!
Fique com Deus!!!

Criado 6 de dezembro de 2006
Ultima resposta 6 de dez. de 2006
Respostas 2
Participantes 2