getClass().getMethod alguem sabe como usar?

16 respostas
A

Ola
pessoa com uso isso?

getClass().getMethod

desde ja agradeço

16 Respostas

R

Isso é Reflection:
Eis um exemplo:

//Exemplo de reflexão
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


public class Teste14ReflectionClass {

	public static void main(String[] args) {
		
		
	
		//Pede que o usuário informe o nome de uma classe para ser verificada	
		System.out.println("Digite uma classe: ");
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		try {
			Class emp;
			
			/*Obtém o objeto Class a partir de um nome de classe fornecido
			na forma de String*/
			emp = Class.forName(in.readLine());
			
			
			//getModifiers() retorna os modificadores de acesso da classe
			System.out.println(Modifier.toString(emp.getModifiers()) + " class " +
					emp.getName() + " extends " + emp.getSuperclass());
			System.out.println("{");
			
			/*getDeclaredFields() retorna um array de Field, que corresponde
			aos atributos da classe*/
			Field [] fi = emp.getDeclaredFields();
			
			for (int i = 0; i &lt fi.length; i++)
			{
				//getType() retorna o tipo de um Field
				Class tipo = fi[i].getType();
				System.out.println(tipo.getName() + " " + fi[i].getName() + ";");
			}
			
			/*getDeclaredConstructors() retorna um array de Constructor, que corresponde
			aos construtores definidos para a classe*/
			Constructor [] con = emp.getDeclaredConstructors();
			for (int i = 0; i &lt con.length; i++)
			{
				/*getParameterTypes() retorna um array de informações de tipo
				dos parâmetros da classe*/
				Class [] params = con[i].getParameterTypes();
				System.out.print(Modifier.toString(con[i].getModifiers()) + " " + con[i].getName() + 
						"(");
				for (int j = 0; j &lt params.length; j++)
				{
					if (j &gt 0) System.out.print(",");
					System.out.print(params[j].getName());
				}
				System.out.println(");");
			}
			
			/*getMethods() retorna um array de Method, que corresponde aos métodos
			definidos para a classe*/
			Method [] me = emp.getMethods();
			
			for (int i = 0; i &lt me.length; i++)
			{	
				//Para cada método, obtém os parâmetros
				Class [] params = me[i].getParameterTypes();
				System.out.print(Modifier.toString(me[i].getModifiers()) + " " +
						me[i].getReturnType().getName() + 
						" " + me[i].getName() + "(");
				for (int j = 0; j &lt params.length; j++)
				{
					if (j &gt 0) System.out.print(",");
					System.out.print(params[j].getName());
				}
				System.out.println(");");
			}
			
			System.out.println("}");
			
			
		} catch (ClassNotFoundException e) {
			
			System.out.println("Classe não encontrada");
		}
		catch(IOException e1)
		{
		
		}
		
	}
}

class Empregado
{
	String nome;
	int idade;
	double salario;
	
	public double getSalario() { return salario; }
	public int getIdade() { return idade; }
	public String getNome() { return nome; }
	public void calculaSalario(int horas) 
	{ 
		if (horas &gt 176)
		{
			salario = 176*10 + (horas - 176)*15;
		}
		else salario = horas*10; 
	}
	public void setIdade(int i) { idade = i; }
	public void setNome(String n) { nome = n; }
	public void mostraDados()
	{
		System.out.println("Nome do empregado: " + nome);
		System.out.println("Idade: " + idade);
		System.out.println("Salário: " + salario);
		
	
	}
	public Empregado()
	{
		nome = "";
		idade = 0;
		salario = 0;

	}
	
	
}

class Gerente extends Empregado
{
	double bonus;
	void setBonus(double b) { bonus = b;}

	public void calculaSalario(int horas)
	{
		if (horas &gt 176)
		{
			salario = 176*20 + (horas - 176)*30;
		}
		else salario = horas*20; 
		salario += bonus;
	}
	public void mostraDados()
	{
		System.out.println("Nome do chefe: " + nome);
		System.out.println("Idade: " + idade);
		System.out.println("Salário: " + salario);
	
	}
	
}
D

Tem um artigo aqui no GUJ. Use como referência.

A

Como eu faço para acessar um metodo de uma classe a passar um parametro do tipo inteiro?

desde ja agradeço

D

Method m = obj.getClass().getMethod(“seuMetodo”, new Class[] { Integer.class } );
m.invoke( obj, new Integer { 1 } );

A

O nome da minha classe frmClientes
que possui o metodo

GravaDados(int tipo);

no construtor dessa classe frmClientes eu coloquei

botoes.setTela(new frmClientes());

na minha classe botoes eu coloquei

Method m = tela.getClass().getMethod("GravaDados", new Class[] { Integer.class } ); m.invoke( tela, new Integer { 1 } );

esta certo a minha logica?

e na segunda linha

m.invoke( tela, new Integer { 1 } );

esto com erro mas tudo bem, quero intender como funciona depois eu resolvo.

desde ja agradeço

D

O teu método setTela() recebe que tipo de objeto?

A

Recebe a instancia da minha tela!

desde ja agradeço

D

Sim, isso eu vi, mas qual o tipo do argumento?

A

Opa acho que perdi alguma coisa pelo caminho.

pelo que intendi e isso passo a instancia da minha tela
para uma variavel da minha classe botoes
apartir dessa variavel eu executo o metodo.

vc poderia me explicar melhor ou me indicar um lugar onde eu possa intender?

desde ja agradeço

A

Olhando melhor a sua pergunta,
vc se refere na declaração da variavel?

private Object tela;
L

Oi,
desculpe me meter.. mais olha só como eu faço isso:

Method 
m = tela.getClass().getMethod("GravaDados", new Class[] { Integer.class } );
                 				                        
//
// Constroi a ação
//				
ActionListener
lo_action = new ActionListener() {						
public void actionPerformed(ActionEvent e){						
 
 //
 // recolhe o método
 //
 try {
     
     lo_action_method.invoke(io_tela,new Object[]{Integer.class});	

 }
 catch(Exception ex){
	ex.printStackTrace();
 }
}
};

Você está com erro na linha :

m.invoke( tela, new Integer { 1 } );

porque o invoke só aceita 2 Arrays de Objetos...aff, minha identação não é boa pra colocar com [code]..

D

Eu falava na declaração do método mesmo.

setTela( XXX x ) {}

Onde XXX é igual à ???

A

Por favor lina pode mandar sua ajuda sempre é muito bem vinda
e de fato sua identação me deixou meio confuso mas nada com ctrl+alt+f
não resolva.
desde ja agradeço

respondendo ao danieldestro

sera que isso

public void setTela(Object tela) {

this.tela = tela;

}

Segue o exception

java.lang.NoSuchMethodException: com.softin.aginesNetwork.gui.forms.ferramentaria.FrmCadastroTipoServ.GravaDados(java.lang.Integer)
	at java.lang.Class.getMethod(Unknown Source)
	at com.softin.aginesNetwork.gui.components.botoesComuns.btNovoNV1ActionPerformed(Unknown Source)
	at com.softin.aginesNetwork.gui.components.botoesComuns$1.actionPerformed(Unknown Source)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
D

Só uma pergunta. Pq vc utiliza Object, já que trabalha com AWT (talvez até swing)?

A

Eu não sei te responder.
deixa eu explicar algumas coisas.

Esse sistema que eu trabalho foi desenvolvido totalmente estruturado
estou trabalhando nele a uns 8 meses e separei o sistema por camadas
como um framework .

a classe dos botoes esta em um projeto a parte e a tela em outro,
No projeto onde esta a tela eu adiciono o .jar do projeto dos botoes.

D

Faz um método +/- assim:

private Object executeMethod( Object obj, String name ) throws Exception { Method createMethod = obj.getClass().getMethod( name, new Class[0] ); return createMethod.invoke( obj, new Object[0] ); }

E deixa pronto pra reusar. Neste caso ai o método não recebe nenhum argumento, mas você pode adaptá-lo.

Criado 9 de janeiro de 2007
Ultima resposta 9 de jan. de 2007
Respostas 16
Participantes 4